Python ETree.find 找不到复杂路径

Python ETree.find not finding with complex path

提问人:Tornado547 提问时间:9/22/2023 更新时间:9/22/2023 访问量:45

问:

我有一个看起来像这样的 xml 元素

<PI Name="MonitoredVariable">
    <Reference Object="SomeName" />
</PI>
<PI Name = "Other Properties" />
<PI Name = "Other Properties" />
<PI Name = "Other Properties" />

我想抓取引用元素

当我尝试用

ref = elem.find("./PI[@Name='MonitoredVariable']/Reference")

ref 最终为 None。

当我尝试用

if superref := elem.find("./PI[@Name='MonitoredVariable']"):
    ref = superref.find('Reference')

ref 最终为正确的值。第二组代码更难理解,而且速度可能更慢,所以我更愿意弄清楚为什么第一组代码不起作用。

python xml 元素树

评论

1赞 Andrej Kesely 9/22/2023
你能编辑你的问题并放一个我们可以运行的例子吗?对我来说,运行正常。root.find("./PI[@Name='MonitoredVariable']/Reference")
0赞 Masklinn 9/22/2023
我得到了与 Andrej 相同的经验,将所有元素包装在某种根元素中会发现从 3.7 到 3.11 的每个 python 版本中预期的元素。如果没有实际的测试/重现脚本,就不可能知道可能出了什么问题。PI./PI[@Name='MonitoredVariable']/Reference

答:

0赞 Hermann12 9/22/2023 #1

你的问题不清楚,请编辑,你喜欢捕捉什么,你的根标签看起来如何?

import xml.etree.ElementTree as ET

xml_s = """<root><PI Name="MonitoredVariable">
    <Reference Object="SomeName" />
</PI>
<PI Name = "Other Properties" />
<PI Name = "Other Properties" />
<PI Name = "Other Properties" /></root>"""

tree = ET.fromstring(xml_s)

ref = tree.find(".//PI/Reference[@Object]")
print(ref.attrib['Object'])

输出:

SomeName