【问题标题】:XML - How to get child node count using javaXML - 如何使用 java 获取子节点数
【发布时间】:2016-09-23 03:33:28
【问题描述】:

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

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(即&lt;sid&gt;hello&lt;/sid&gt;)。但是上面的 sn-p 输出为 3。有人可以帮我弄清楚这里发生了什么吗?我是 java 新手,感谢您的帮助。

【问题讨论】:

  • 检查每个节点的类型。并非所有子节点都是元素节点。我想你会发现只有一个元素类型的子节点。
  • 为什么它输出 3 而不是 1 ? sn-p 是否计算所有节点,包括 parent

标签: java xml


【解决方案1】:

谁能帮我弄清楚这里发生了什么?

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

  1. 包含&lt;parent&gt;&lt;sid&gt; 之间字符的文本节点
  2. 一个元素节点对应&lt;sid&gt;hello&lt;/sid&gt;
  3. 包含&lt;/sid&gt;&lt;/parent&gt; 之间字符的文本节点

它被称为混合内容,它是在给定元素内混合文本和元素的能力。

如果您尝试使用&lt;parent&gt;&lt;sid&gt;hello&lt;/sid&gt;&lt;/parent&gt; 启动程序,您将得到1,因为您在标签之外不再有任何字符。

混合内容的一个很好的例子是XHTML,您可以在其中拥有类似的东西

<p>Hello <strong>World</strong></p>

如果您对此进行解析,则元素 p 将具有 2 节点,因为我们期望一个包含“Hello”的文本节点和一个元素节点 &lt;strong&gt;World&lt;/strong&gt;


我们如何获得子节点的数量(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

【讨论】:

  • 我有相同的 XML 文件,它的相关子节点是(sid)动态创建的。它遵循与给定问题相同的结构,因此会有那些“隐藏”的文本字段。那么我们如何获得子节点的数量(sid 子节点的数量)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多