如何检测xml节点的数量?

时间:2015-12-25 22:10:25

标签: java python xml lxml

检测文档中xml节点数的最佳方法是什么?以下是一些例子:

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

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

这是一个更传统的例子:

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

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

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

事先不知道结构,确定文档中xml节点数的最佳方法是什么?这里的语言并不重要,但更喜欢java或python。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

&#34;在DOM中,XML文档中的所有内容都是节点。&#34;

在XML Node和Element中是不同的东西,你似乎可以互换使用它们。

从您的示例中,看起来您正在寻找&lt; Item&gt;标签(除非找不到,然后&lt; Items&gt;计为一个),而不是节点。那么只计算一下吗?

计算&lt; Item&gt;的数量Python中的标记,将XML加载到名为xml,fx:

的字符串中
xml = '<Items><Item>...</Item><Item>...</Item></Items>'
xml.count('<Item>')

答案 2 :(得分:1)

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

count(//*)

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