Dom4J: Как заменить элемент XML его текстовым значением

Я использую dom4j для разбора xml вот так:

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

И я хочу изменить это на другой XML, как это:

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

Это возможно с dom4j?

Я думаю, что хитрость заключается в том, чтобы разобрать узел внутри текста.

1 ответ

Вы можете достичь того, что хотите, выполнив содержимое элемента Element вашего узла и заменив тег "a" его текстовым значением.

Итак, если у вас есть узел в Element объект

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

Вы можете сделать это таким образом, см. Встроенные комментарии:

// 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>
Другие вопросы по тегам