XPath逻辑条件和findall函数

XPath logical condition and findall function

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

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

<\item>

我想提取所有项目的主要术语(在本例中为聚烯烃、水)的值,其中描述符类型不是 MEA 或 MEB(首先,我一直试图检索这些类型不是 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谓词”错误.

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

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

The ElementTree library comes with a simple XPath-like path language called ElementPath... However, advanced features like value comparison and functions are not available.

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