【问题标题】:Using ElementTree to find a node - invalid predicate使用 ElementTree 查找节点 - 无效谓词
【发布时间】:2019-03-08 17:06:14
【问题描述】:

我对这个领域很陌生,所以我确信这只是显而易见的事情。我正在尝试更改 python 脚本,以便它以不同的方式找到节点,但出现“无效谓词”错误。

import xml.etree.ElementTree as ET

tree = ET.parse("/tmp/failing.xml")
doc = tree.getroot()
thingy = doc.find(".//File/Diag[@id='53']")
print(thingy.attrib)
thingy = doc.find(".//File/Diag[BaseName = 'HTTPHeaders']")
print(thingy.attrib)

这应该两次找到相同的节点,但第二次找到错误。这是 XML 的摘录:

<Diag id="53">
            <Formatted>xyz</Formatted>
            <BaseName>HTTPHeaders</BaseName>
            <Column>17</Column>

我希望我没有削减太多。基本上,用“@id”找到它是可行的,但我想搜索那个 BaseName 标记。

实际上,我想搜索标签的组合,所以我排列了一个更复杂的表达式,但我无法让简单的表达式工作!

【问题讨论】:

  • 我可以用 Python 2.7 重现错误,但不能用 Python 3.7。
  • “我有一个更复杂的表达式” - 你可能想改用lxmlxpath support in ElementTree 非常有限。

标签: python xml xpath elementtree


【解决方案1】:

问题中的代码在使用 Python 3.7 时有效。如果谓词中等号前后的空格被删除,它也适用于早期的 Python 版本。

thingy = doc.find(".//File/Diag[BaseName='HTTPHeaders']")

https://bugs.python.org/issue31648

【讨论】:

  • 奇怪,我正在使用 python 3。我将不得不获取一个缩减的 XML 文件并发布一个完整的工作示例 - 或者这样做我会发现问题。以防万一,我也会尝试不使用空格!我会尽快给您回复。谢谢。
  • 但是您使用的是 Python 3.7 吗?空白问题已在该特定次要版本中得到修复。
  • 原来我在我的 Linux 机器上使用了 python 3.5(当我使用 Windows 时是 3.7!)。你已经回答了我的问题,但我有一个后续问题。查看我的原始脚本,我可以看到我只添加了空格来尝试摆脱原始问题:thingy = doc.find(".//File/Diag[BaseName='HTTPHeaders' and MsgNum='1063' and行='48']") 。即使没有空格,我也会收到错误消息。所以我一定是做错了“和”?
  • PS - 我用这个作为我的信息来源 - w3schools.com/xml/xpath_operators.asp。也许我读错了信息?
  • ElementTree 仅支持完整 XPath 的子集。 and 运算符不起作用。见docs.python.org/3/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2018-11-06
相关资源
最近更新 更多