如果我有这样的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")
我在文档的示例中没有看到这样的内容。有什么想法吗?
答案 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)
这是一个解决方案,您无需指定&#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