getElementsByTagName搜索所有级别的XML节点

时间:2013-11-12 15:01:36

标签: java xml dom xpath

我有这个XML文件:

<root>
    <node1>
        <name>A</name>
        <node2>
            <name>B</name>
            <node3>
                <name>C</name>
                <number>001</number>
            </node3>
        </node2>
    </node1>
</root>

我正在解析文件,获取每个节点的名称,以及相应的数字(如果存在)。

我用:

String number = eElement.getElementsByTagName("number").item(0).getTextContent();

这应该给我一些:

Name | Number
A    | 
B    |
C    | 001

但我明白了:

Name | Number
A    | 001
B    | 001
C    | 001

所以,我认为getElementsByTagName("Number")正在寻找节点所有子节点中的数字节点。我不希望这样。有人知道解决方法吗?

我想过使用XPath而不是上面的方法,但我真的想知道是否有现成的方法。感谢

3 个答案:

答案 0 :(得分:2)

您可以使用JDK / JRE中的javax.xml.xpath API来更好地控制通过getElementsByTagName返回的XML。

import java.io.File;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
        Document document = docBuilder.parse(new File("filename.xml"));

        XPathFactory xpathFactory = XPathFactory.newInstance();
        XPath xpath = xpathFactory.newXPath();
        Element element = (Element) xpath.evaluate("//node3/name", document, XPathConstants.NODE);
    }

}

答案 1 :(得分:0)

希望这有帮助,

import java.io.File;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class XML {

public static void main(String[] args) throws IOException {
    File input = new File("D:\\sample.xml");
    Document doc = Jsoup.parse(input, "UTF-8");
    Elements allElements = doc.select("root");
    for(Element value : allElements){
        System.out.println(value.text());
    }
    String node3Num = doc.select("node3").tagName("number").text();

        System.out.println(node3Num);
}

}

输出: A B C 001 C 001

我使用过jsoup-1.7.2 jar(你可以从jsoup.org下载)

答案 2 :(得分:0)

假设您的eElement变量始终是有问题的<node1/><node2/>,...元素之一,那么当您替换上面提到的自己的代码段时,以下代码应该有效:< / p>

String number = null;
NodeList childNodes = eElement.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
  Node node = childNodes.item(i);
  if (node.getNodeType() == Node.ELEMENT_NODE
      && node.getNodeName().equals("number")) {
    number = node.getTextContent();
    break;
  }
}

当没有number孩子时,null变量将为<number/>;它将包含您需要的数字。