【问题标题】:XPath logical condition and findall functionXPath 逻辑条件和 findall 函数
【发布时间】:2021-10-08 04:54:56
【问题描述】:

我正在尝试使用 XPath 查找所有 具有特定类型属性的 XML 元素。以下代码显示了 XML 结构的相关部分:

<item>
                    <descriptorgroup>
                        <descriptors type="MEA">
                            <descriptor>
                                <mainterm> polyolefin </mainterm>
                            </descriptor>
                            <descriptor>
                                <mainterm> water </mainterm>
                            </descriptor>

<\item>

我想提取描述符类型不是 MEA 或 MEB 的所有项目的主要术语(在本例中为聚烯烃,水)的值(首先,我一直在尝试检索这些在哪里type 不是 MEA。我尝试了以下代码:

terms = item.findall(".//ns0:descriptors[not(@type ='MEA')]//ns0:mainterm", prefix_map), 其中prefix_map指定了ns0对应的命名空间。

将此代码修改为terms = item.findall(".//ns0:descriptors[@type ='MEA']//ns0:mainterm", prefix_map) 成功找到满足特定条件的所有项目(例如@type = "MEA"),但在添加not 时,我得到一个“invalid predicate”错误.

我看到类似的问题,例如XPath to find elements that does not have an id or class,其中明确了not条件的语法,但似乎这个条件与item.findall不兼容?我是 lxml 和 ElementTree 的新手,不知道我可以用什么替换 findall 函数来让我的条件起作用。

【问题讨论】:

  • 您是否要排除@type 属性或它们的值?另外,请添加您正在使用的 xml 的最低工作示例,
  • 对不起,我已经添加了信息
  • 您问题中的示例 xml(非常)格式不正确,并且没有任何必要的命名空间信息。忽略命名空间问题,通过猜测正确的 xml 格式可能会给您一个 lxml 答案,但它可能不适用于您的实际 xml。
  • @Magdalena xpath() 方法让您可以使用 xpath 的全部功能。 lxml.de/xpathxslt.html#the-xpath-method

标签: xml conditional-statements lxml elementtree


【解决方案1】:

如上所述,findall() 不使用真正的 XPath。来自tutorial

ElementTree 库带有一个简单的类似 XPath 的路径语言 叫做 ElementPath... 但是,高级 值比较和函数等功能不可用。

要使用像 not() 这样的 XPath 函数,请尝试 terms = item.xpath(".//ns0:descriptors[not(@type ='MEA')]//ns0:mainterm", prefix_map)

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多