Как получить содержимое узла XML с Dom4j в Java - PullRequest
1 голос
/ 29 ноября 2011

У меня есть XML-файл, например:

<description>
  <text>blahblah</text>
  <code>code</code>
  <text>blah</text>
</description>

Я перешел на узел description и хочу прочитать весь контент, включая <text> и т. Д.

Я использовал getText(), но он вернул пустую строку.
Я использовал getStringValue(), но он отфильтровал все <text>.
Я использовал asXML(),результат близок, но результат содержит <description>, который мне не нужен.

Существует ли метод для получения содержимого XML элемента?

Ответы [ 4 ]

3 голосов
/ 29 ноября 2011

Примерно так:

public static void main(String[] args) throws DocumentException {
  String xml = "<description><text>blahblah</text><code>code</code><text>blah</text></description>";
  SAXReader reader = new SAXReader();
  Document doc = reader.read(new StringReader(xml));
  Element description = doc.getRootElement();
  String content = getContent(description);
  System.out.println(content);
}

private static String getContent(Element element) {
  StringBuilder builder = new StringBuilder();
  for (Iterator<Element> i = element.elementIterator(); i.hasNext();) {
    Element e = i.next();
    builder.append(e.asXML());
  }
  return builder.toString();
}

Обратите внимание, что если сам элемент имеет текстовое содержимое, он не будет возвращать текстовое содержимое, только дочерние узлы.

3 голосов
/ 29 ноября 2011

Предположим, что document является экземпляром org.dom4j.Document, тогда

String xPath = "description";
List<Node> nodes = document.selectNodes( xPath );
for (Node node : nodes) {
 node.asXML()
}
0 голосов
/ 02 апреля 2014

Просто хочу добавить к принятому ответу qwerky:

ТАКЖЕ иметь возможность анализировать содержимое только текстовых элементов (т. Е. Оно не содержит вложенный xml):

public static String getContent(Element element) {
    if (element.isTextOnly())
        return element.getText();
    StringBuilder sb = new StringBuilder();
    Element currElement = null;
    for (Iterator<Element> iterator = element.elementIterator() ; iterator.hasNext() ; /* Continue till done */) {
        currElement = iterator.next();
        sb.append(currElement.asXML());
    }
    return sb.toString();
}

Итак, я добавил следующее в начале метода:

if (element.isTextOnly())
    return element.getText();
0 голосов
/ 29 ноября 2011

Вы должны посмотреть на использование XPath: http://www.ibm.com/developerworks/library/x-javaxpathapi/index.html

...