XML - 如何使用java

时间:2016-09-22 18:28:07

标签: java xml

我有一个java代码,如下所示。根据我的理解,它应该在给定的<parent>文件中显示父节点test.xml的子节点数。

try {
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    Document doc = docBuilder.parse(new File("./test.xml"));
    System.out.println(doc.getElementsByTagName("parent").item(0).getChildNodes().getLength());
} catch(Exception e) {
    e.printStackTrace();
}

这是我的test.xml文件。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<parent> 
    <sid>hello</sid>
</parent>

在此XML中,父节点parent的子节点数为1(即<sid>hello</sid>)。但上面的片段输出为3.有人可以帮我弄清楚这里发生了什么?我是java的新手,感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  

有人可以帮我弄清楚这里发生了什么吗?

您的节点parent确实有3个子节点:

  1. 包含<parent><sid>
  2. 之间字符的文本节点
  3. <sid>hello</sid>
  4. 对应的元素节点
  5. 包含</sid></parent>
  6. 之间字符的文本节点

    它被称为混合内容,它能够在给定元素中混合文本和元素。

    如果您尝试使用<parent><sid>hello</sid></parent>启动程序,则会得到1,因为您在标记之外不再有任何字符。

    混合内容的一个很好的例子是XHTML,您可以在其中找到类似

    的内容
    <p>Hello <strong>World</strong></p>
    

    如果你解析它,元素p将有2个节点,因为我们期望一个文本节点包含&#34; Hello&#34;和元素节点<strong>World</strong>

      

    我们如何获得数字子节点(sid个子节点的数量)?

    最简单的方法是使用JDOMdom4j解析器,因为它们用于解析您需要的纯XML数据结构。

    代码将出现在JDOM

    的情况下
    SAXBuilder saxBuilder = new SAXBuilder();
    Document document = saxBuilder.build(new File("./test.xml"));
    System.out.println(document.getRootElement().getChildren().size());
    

    <强>输出:

    1
    

    代码将出现在dom4j

    的情况下
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("./test.xml"));
    System.out.println(document.selectNodes("/parent/*").size());
    

    <强>输出:

    1