如何检测 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元素(2Item
s),但是无法检测到,例如通过计算根后第一个元素的出现次数(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(//*)
计算其他节点(例如属性)也同样容易。
检测文档中 xml 个节点数的最佳方法是什么?这里有几个例子:
<Items>
<Timestamp></Timestamp>
<Item>
<ID>1</ID>
<ID>2</ID>
<ID>3</ID>
<ID>4</ID>
</Item>
<Item>
...
</Item>
</Items>
上面的例子有两个xml元素(2Item
s),但是无法检测到,例如通过计算根后第一个元素的出现次数(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中节点和元素是不同的东西,你似乎可以互换使用它们。
从您的示例来看,您似乎在寻找
要计算 Python 中
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(//*)
计算其他节点(例如属性)也同样容易。