java - 如何检测xml节点的数量?

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

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

<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)

关于java - 如何检测xml节点的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466854/

相关文章:

python - 获取 boolean 数组中至少 n 个连续 False 值的第一个 block 的索引

python - 迭代更改 Pandas 数据框列中的每个单元格

mysql - 当 MySQL 中有多个匹配项时更新 XML 节点

java - 无法再从 oracle 站点 curl JDK

java - 在java中创建本地http监听器

java - 如何将观察者模式与 jms 接收器一起应用

xml - 为编码的 XML 值应用 XSLT 模板

Java JFrame访问进度条

python - C++ 与 Python 嵌入 : crash if Python not installed

使用 ganymed-ssh2 将 java scp 文件发送到远程