Python ElementTree findall';或';操作人员

Python ElementTree findall';或';操作人员,python,elementtree,Python,Elementtree,如果我有这样一个xml文件: <root> <item> <prop>something</prop> </item> <test> <prop>something</prop> </test> <test2> <prop>something</prop> </test2> </root&

如果我有这样一个xml文件:

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

某物
某物
某物
我可以用
xmlTree.getroot().findall(“项目”)
获取所有“item”元素

如何获取所有的“item”或“test”元素?我想要像这样的东西:

xmlTree.getroot().findall(“项目或测试”)

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

因为stdlib只提供有限的xpath支持,所以只有在使用
lxml
时,才能使用
xpath或运算符:

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
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
大数据集的“通配符”解决方案 这里是一个不需要指定“a | B |……”的解决方案。相反,使用“*”作为通配符,并按代码中如下所示的索引过滤掉不需要的部分(例如,在这个问题中,可以使用lst[:-1]排除最后一个标记“test2”)

将xml.etree.ElementTree作为ET导入
数据=“”
有些事
什么
有些事
'''
root=ET.fromstring(数据)
lst=root.findall('*'))
对于lst中的x[:-1]:
打印(x.find('prop')。文本)
输出:

有些事


something2

我喜欢带有xpath的第一个版本。您的代码按指示工作。但是,我尝试将其更改为从文件中读取xml:#--coding:utf-8--将xml.etree.ElementTree作为ET tree=ET.parse('data.xml')导入tree.xpath('//item |//test')中的元素:print element.text但我得到AttributeError:ElementTree实例没有属性“xpath”,我还尝试对root.findall('item | test')中的元素使用如下xpath语法:root=tree.getroot():print element.text但没有输出任何内容?啊,我现在看到了lxml和xml.etree.ElementTree之间的区别。它是这样工作的。这些模块之间还有其他区别吗?也就是说,如果我有使用etree.ElementTree编写的其他代码,那么如果我更改为lxml,它会继续工作吗?@DavidDoria应该可以,但您可能需要稍微更改代码,请参见差异。
for element in tree.iter():
    if element.tag in ('item', 'test'):
        print element.text
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)