【问题标题】:Can .findall() match multiple values in python etree?.findall() 可以匹配 python etree 中的多个值吗?
【发布时间】:2014-07-21 17:38:23
【问题描述】:

有没有办法使用.findall()匹配树中的多个元素?

我想这样做:

trees = log.findall('element1' or 'element2')

这是我的解决方法(在我的情况下有效,因为我在同一个 XML 中没有 e1 和 e2):

trees = log.findall('element1')
if not trees:
    trees = log.findall('element2')

我正在解析结构相似但名称不同的 XML 文件。 C# 允许“element1 | element2”匹配。

【问题讨论】:

  • 根据您的解决方法,如果 element1 和 element2 中都有元素怎么办?
  • 好点。我编辑问题更清楚。我正在使用 1 或 2 的样板代码,从不同时使用。
  • @user3769076: 你能要求lxml 并使用lxml.etree 代替标准库xml.etree 吗?它通常用作直接替代品,并在此处提供更好的答案。

标签: python xml.etree


【解决方案1】:

不,你不能。 C# 似乎在使用 XPath 表达式,但 ElementTree XPath support for XPath queries 太有限,不包括对此的支持。

如果第一个搜索为空,您可以使用or 选择第二个搜索:

trees = log.findall('element1') or log.findall('element2')

因为空结果是 false-y。

另一种方法是使用lxml,这是libxml2 之上的ElementTree API 实现,supports all of the XPath 1.0 spec。然后你可以这样做:

log.xpath('.//(element1|element2)')

【讨论】:

  • etree API 的lxml 实现是否支持XPath 中的|?如果是这样,这可能是 OP 可接受的替代方案。
  • @abarnert: lxml 支持所有 XPath 1.0。
  • 是的,我只是不确定它的 etree findall 中是否有完整的 XPath(由于某种原因,它没有在我坐的机器上构建,所以我可以' t 测试...)。
  • @abarnert: 不,.xpath() 是这里使用的方法; .findall() 与原始 API 实现保持错误兼容。
  • 谢谢,我无法从网页或任何其他解释中找到您可以在 xpath 中使用 (a|b) 的信息。尽管 lxml 是最好的工具之一,但文档很糟糕。
猜你喜欢
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2012-12-30
  • 2023-01-25
相关资源
最近更新 更多