元素树findall'或'op'

2024-04-25 11:39:50 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样的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")

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


Tags: or文件文档test元素示例rootxml
2条回答

大数据集的“通配符”解决方案

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

输出:

一些事情

有什么事吗

由于stdlib中的ElementTree仅提供有限的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

印刷品:

^{pr2}$

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

相关问题 更多 >