Java 如何在不知道其模式的情况下遍历xml节点

Java 如何在不知道其模式的情况下遍历xml节点,java,xml,Java,Xml,我知道我可以使用DocumentBuilder解析xml文件并遍历节点,但我一直无法确定节点是否还有子节点。例如,在这个xml中: <MyDoc> <book> <title> ABCD </title> </book> </MyDoc> 如果我执行node.hasChildNodes,则图书和书名都将为true。但我想做的是,如果一个节点有一些文本值,而不是像title这样的属性,那么就打印它,否则就什么也不做

我知道我可以使用DocumentBuilder解析xml文件并遍历节点,但我一直无法确定节点是否还有子节点。例如,在这个xml中:

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

如果我执行node.hasChildNodes,则图书和书名都将为true。但我想做的是,如果一个节点有一些文本值,而不是像title这样的属性,那么就打印它,否则就什么也不做。我知道这是一个简单的检查,但我似乎在网上找不到答案。我可能没有用正确的关键字搜索。提前感谢。

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

您必须通过调用getChildNodesby调用getNodeType来检查子节点的类型。有一个ELEMENT\u NODE类型的子元素,而有一个TEXT\u NODE类型的子元素。

我不确定,但我认为您需要一种方法来迭代所有元素,无论其嵌套程度如何。下面的代码递归地遍历所有元素。然后,它打印元素值,只要它不只是空白:

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

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

参考: