如何检测 xml 个节点的数量?

How to detect number of xml nodes?

检测文档中 xml 个节点数的最佳方法是什么?这里有几个例子:

<Items>
    <Timestamp></Timestamp>
    <Item>
        <ID>1</ID>
        <ID>2</ID>
        <ID>3</ID>
        <ID>4</ID>
    </Item>
    <Item>
        ...
    </Item>
</Items>

上面的例子有两个xml元素(2Items),但是无法检测到,例如通过计算根后第一个元素的出现次数(Timestamp).

这是一个更传统的例子,可以:

<Items>
    <Item>
        ...
    </Item>
    <Item>
        ...
    </Item>
</Items>

或者,一个更模糊的例子,可能只有一个元素(父元素"Items")--

<Items>
    <References>
        ...
    </References>
    <Talk>
        ...
    </Talk>
</Items>

在事先不知道结构的情况下,确定文档中 xml 节点数的最佳方法是什么?语言在这里无关紧要,但更喜欢 java 或 python.

"In the DOM, everything in an XML document is a node."

在XML中节点和元素是不同的东西,你似乎可以互换使用它们。

从您的示例来看,您似乎在寻找 标签(除非找到 none,然后 算作一个),而不是节点。那么简单地计算那些?

要计算 Python 中 标签的数量,请将 XML 加载到名为 xml 的字符串中,fx:

xml = '<Items><Item>...</Item><Item>...</Item></Items>'
xml.count('<Item>')

"the number of repeated primary sub-elements of the root node." 虽然描述可以解释,但从我的阅读方式来看,您可以将 XML 读入 ElementTree,枚举根通过迭代计算节点并使用 collections.Counter.

对它们进行计数
import xml.etree.ElementTree as ET
import collections

refdoc = """<Items>
    <Timestamp></Timestamp>
    <Item>
        <ID>1</ID>
        <ID>2</ID>
        <ID>3</ID>
        <ID>4</ID>
    </Item>
    <Item>
        ...
    </Item>
</Items>"""

doc = ET.XML(refdoc)
counts = collections.Counter(elem.tag for elem in doc)
print(counts)
total = sum(count for count in counts.values() if count > 1)
print(total)

这导致

Counter({'Item': 2, 'Timestamp': 1})
2

你甚至可以把它压缩成更少的行

total = sum(count for count in collections.Counter(
    elem.tag for elem in ET.XML(refdoc)).values() 
    if count > 1)

我强烈建议使用正确的工具来完成任务,在本例中就是 XPath。使用 XPath,计算 元素节点 (如果这是你的意思 "nodes")就像:

count(//*)

计算其他节点(例如属性)也同样容易。