Python ElementTree findall';或';操作人员
如果我有这样一个xml文件: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&
<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)