如何计算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'的出现次数?

+0

可能有帮助,https://docs.python.org/2/library/xml.etree.elementtree.html#supported-xpath-syntax –

+0

你的意思是:'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 
+0

lxml依赖! – Jackie

+0

@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']")) 

应该给你你想要的。

+0

有什么方法可以找到标签'上下文'的计数/长度'包含'文本'对齐'?可以是单行的 – Jackie

+1

'x.findall(“.//* [context ='aligned']”)'应该可以工作。 – dnswlt

+0

您可以编辑上述解决方案,如下所示:从xml.etree导入ElementTree作为ET树= ET.parse('sample.xml') root = tree.getroot()print len(root.findall('.// context '))print len(root.findall(“.//* [context ='aligned']”))。这看起来非常简单直接。 – Jackie