繁体   English   中英

如何检测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元素(2个Item ),但是无法检测到,例如,通过计算根之后第一个元素的出现次数( Timestamp )。

这是一个更常规的示例,它可以:

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

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

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

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

“根节点重复的主要子元素的数量。” 尽管描述可以解释,但按照我的阅读方式,您可以将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)

“在DOM中,XML文档中的所有内容都是一个节点。”

在XML Node和Element中是不同的事物,您似乎可以互换使用它们。

从您的示例中,您似乎正在寻找<Item>标记(除非找不到任何标记,否则<Items>视为一个),而不是节点。 因此,简单地算一下?

要计算Python中<Item>标签的数量,请在名为xml fx的字符串中加载XML:

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

我强烈建议为任务使用正确的工具,在本例中为XPath。 使用XPath,对元素节点进行计数(如果这就是“节点”的意思)很容易:

count(//*)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM