如何计算xml文件中包含“特定文本”的标记,而不考虑层次结构?

时间:2017-02-10 10:02:30

标签: python xml xml-parsing

我有要解析的示例xml文件。如何计算包含特定标签[Python]的标签的出现次数?

<xml>
  <t1>fdhdhd</t1>
  <t2>fdhdhd</t2>
  <sub>
      <context>aligned</context>
  </sub>
 <context>not-aligned</context>
    <sub>
      <context>aligned</context>
  </sub>
</xml>

如何计算包含“对齐”和“未对齐”文字的标记“sub”的出现次数?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如果您想在标准库中执行此操作(即没有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']"))

应该给你你想要的东西。