2014-09-30 80 views
0

我知道我可以使用DocumentBuilder来解析xml文件并遍历节点,但我一直在研究节点是否有更多子节点。因此,例如,在该XML:如何在不知道模式的情况下遍历xml节点

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

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

回答

0

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

0

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

0

我不确定,但我想你想要一种遍历所有元素的方式,而不管它是如何嵌套的。以下递归遍历所有元素。然后,只要打印的元素值作为其不只是空白:在元素节点存在于DOM

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()); 
     } 
    } 
}