ElementTree findall'或'运算符

时间:2014-03-21 13:57:33

标签: python elementtree

如果我有这样的xml文件:

<root>
  <item>
    <prop>something</prop>
  </item>
  <test>
    <prop>something</prop>
  </test>
  <test2>
    <prop>something</prop>
  </test2>
</root>

我可以用 xmlTree.getroot().findall("item") 获得所有'item'元素。

我如何获得所有'item'或'test'元素?我想要这样的东西:

xmlTree.getroot().findall("item or test")

我在文档的示例中没有看到这样的内容。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

由于stdlib的ElementTree仅提供有限的xpath支持,因此只有在使用|时才能使用lxml xpath OR运算符:

from lxml import etree as ET


data = """<?xml version="1.0"?>
<data>
<item>1</item>
<test>2</test>
</data>"""

tree = ET.fromstring(data)

for element in tree.xpath('//item|//test'):
    print element.text

打印:

1
2

如果是xml.etree.ElementTree,您可以合并两个单独的findall()来电的结果:

for element in tree.findall('.//item') + tree.findall('.//test'):
    print element.text

或者,检查循环中的标记名称:

for element in tree.iter():
    if element.tag in ('item', 'test'):
        print element.text

答案 1 :(得分:0)

A&#34;外卡&#34;大数据集的解决方案

这是一个解决方案,您无需指定&#34; A | C | ...&#34 ;.而是使用&#34; *&#34;作为外卡,并按索引过滤掉不需要的部分,如下面的代码所示(例如,在这个问题中,最后一个标签&#34; test2&#34;可以通过使用lst [: - 1]来排除)。

import xml.etree.ElementTree as ET
data='''
<root>
  <item>
    <prop>something1</prop>
  </item>
  <test>
    <prop>something2</prop>
  </test>
  <test2>
    <prop>something3</prop>
  </test2>
</root>'''
root = ET.fromstring(data)
lst = root.findall('*')
for x in lst[:-1]:
    print(x.find('prop').text)

输出:

something1

something2