如何计算xml文件中包含“特定文本”的标签,而不考虑层次结构?
我有样本XML文件被解析。我如何计算包含特定标签[Python]的标签的出现次数?如何计算xml文件中包含“特定文本”的标签,而不考虑层次结构?
<xml>
<t1>fdhdhd</t1>
<t2>fdhdhd</t2>
<sub>
<context>aligned</context>
</sub>
<context>not-aligned</context>
<sub>
<context>aligned</context>
</sub>
</xml>
我如何统计包含文字“对齐”和“不对齐”的标签'sub'的出现次数?
xml = '''<xml>
<t1>fdhdhd</t1>
<t2>fdhdhd</t2>
<sub>
<context>aligned</context>
</sub>
<context>not-aligned</context>
<sub>
<context>aligned</context>
</sub>
</xml>'''
from lxml import etree
tree = etree.fromstring(xml)
tree.xpath('count(//sub/context[.="aligned" or .="not-aligned"])')
出来:
2.0
lxml依赖! – Jackie
@Jackie如果您在安装'lxml'时遇到问题,请使用Anaconda,它包含您需要的所有依赖项,并且预先安装'lxml'。 –
如果你想做到这一点的标准库中(即不依赖lxml
),你可以试试这个(假设你的XML文件sample.xml
):
from xml.etree import ElementTree as ET
xml = ET.parse('sample.xml')
count = 0
for e in xml.findall(".//sub[context]"):
if e.find("context").text in ('aligned', 'not-aligned'):
count += 1
print(count)
编辑:如果我理解正确,以我的回答您的评论,你永远要算两个“不对齐”和“对齐”,但始终只是两者之一。另外,您实际上并不在乎哪个元素context
出现在下面。在这种情况下,
from xml.etree import ElementTree as ET
xml = ET.parse('sample.xml')
count = len(xml.findall(".//*[context='aligned']"))
应该给你你想要的。
有什么方法可以找到标签'上下文'的计数/长度'包含'文本'对齐'?可以是单行的 – Jackie
'x.findall(“.//* [context ='aligned']”)'应该可以工作。 – dnswlt
您可以编辑上述解决方案,如下所示:从xml.etree导入ElementTree作为ET树= ET.parse('sample.xml') root = tree.getroot()print len(root.findall('.// context '))print len(root.findall(“.//* [context ='aligned']”))。这看起来非常简单直接。 – Jackie
可能有帮助,https://docs.python.org/2/library/xml.etree.elementtree.html#supported-xpath-syntax –
你的意思是:'sub'包含的子标签包含文本的权利? –