如何在不知道其架构的情况下遍历xml节点

时间:2014-09-30 16:13:41

标签: java xml

我知道我可以使用DocumentBuilder来解析xml文件并遍历节点,但我仍然在弄清楚该节点是否还有更多子节点。例如,在这个xml:

<MyDoc>
 <book>
   <title> ABCD </title>
 </book>
</MyDoc>

如果我做node.hasChildNodes()我的书和标题都是真的。但我想要做的是,如果一个节点有一些文本值(不是属性),如标题然后打印它否则不做任何事情。我知道这是一个简单的检查,但我似乎无法在网上找到答案。我可能没有用正确的关键字搜索。提前谢谢。

4 个答案:

答案 0 :(得分:0)

尝试使用getChildNodes()。这将返回一个NodeList对象,该对象允许您遍历您引用的节点下的所有节点。不管他们可能有什么名字。

答案 1 :(得分:0)

您必须通过调用getChildNodes()来调用getNodeType()来检查您获得的子节点的类型。 <book>的孩子的类型为ELEMENT_NODE,而<title>的孩子的类型为TEXT_NODE

答案 2 :(得分:0)

我不确定,但我认为你想要一种迭代所有元素的方法,无论它是如何嵌套的。下面递归地遍历所有元素。然后它打印元素值,只要它不仅仅是空格:

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException 
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();

    Document doc = builder.parse("test.xml");
    NodeList childNodes = doc.getChildNodes();
    iterateNodes(childNodes);
}

private static void iterateNodes(NodeList childNodes) 
{
    for (int i = 0; i < childNodes.getLength(); ++i)
    {
        Node node = childNodes.item(i);
        String text = node.getNodeValue();
        if (text != null && !text.trim().isEmpty()) {
            System.out.println(text);
        }
        if (node.hasChildNodes()) {
            iterateNodes(node.getChildNodes());
        }
    }
}

答案 3 :(得分:0)

文本节点存在于DOM中的元素节点下,数据始终存储在文本节点中。也许DOM处理中最常见的错误是导航到元素节点并期望它包含存储在该元素中的数据。不是这样!即使最简单的元素节点下面也有一个包含数据的文本节点。

参考:http://docs.oracle.com/javase/tutorial/jaxp/dom/readingXML.html