【问题标题】:Dom4J: How to replace an XML Element by its text valueDom4J:如何用其文本值替换 XML 元素
【发布时间】:2018-03-07 03:25:13
【问题描述】:

我正在使用 dom4j 像这样解析 xml:

<node>
    somestring<br/>some <a href="stackoverflow.com">another string</a> 
</node>

我想把它改成这样的另一个xml:

<node>
    somestring<br/>some another string
</node>

dom4j 有可能吗?

我认为诀窍是解析文本中的节点。

【问题讨论】:

  • 不需要“技巧”或额外的解析。 &lt;node&gt; 具有混合内容,即文本后跟一个空的 &lt;br&gt; 元素,然后是更多文本(空格)和一个 &lt;a&gt; 元素。您应该会看到所有这些对象的 DOM 节点。
  • @JimGarrison 是的,我可以通过 element.getText() 获取所有文本。但是如何按顺序替换节点?考虑用字符串 "\n" 替换
    元素,字符串变为 "somestring \n some another string"。

标签: java dom4j


【解决方案1】:

您可以通过运行节点元素内容并将“a”标签替换为其文本值来实现您想要做的事情。

所以假设你将节点放入Element 对象

String originalXml = "<node>somestring<br/>some <a href=\"stackoverflow.com\">another string</a></node>";
Document document = DocumentHelper.parseText(originalXml);
Element nodeElement = document.getRootElement();

你可以这样做,见内联 cmets:

// once you have your node, as an Element object, get its content
List<Object> content = nodeElement.content();

// go through the content list and replace any "a" tag by its text value
List<Object> newContent = new ArrayList<>();
for(Object o : content) {
  Object newContentObject = o; // keep the same value by default
  if(o instanceof DefaultElement) {
    DefaultElement elem = (DefaultElement)o;
    String tagName = elem.getQName().getName();
    if("a".equals(tagName)) // this is an "a" tag, replace it by a text element
      newContentObject = new DefaultText(elem.getText());
  }
  newContent.add(newContentObject);
}

// Set the new content to your element
nodeElement.setContent(newContent);

System.out.print(nodeElement.asXML());

这个输出:

<node>somestring<br/>some another string</node>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2022-01-11
    • 2021-05-06
    相关资源
    最近更新 更多