XPath语法错误:谓词无效



我有一个XML文件,如下所示:

$ cat sample.xml
<Requests>
<Request>
<ID>123</ID>
<Items>
<Item>a item</Item>
<Item>b item</Item>
<Item>c item</Item>
</Items>
</Request>
<Request>
<ID>456</ID>
<Items>
<Item>d item</Item>
<Item>e item</Item>
</Items>
</Request>
</Requests>

我只想提取Request元素的XML,它对它们的孙子元素Item具有一定的值。这是代码:

bash-4.2$ cat xsearch.py
import sys
import xml.etree.ElementTree as ET

if __name__ == '__main__':
tree = ET.parse(sys.argv[1])
root = tree.getroot()
for request in root.findall(".//Item[.='c item']/../.."):
#for request in root.findall(".//Request[Items/Item = 'c item']"):
print(request)

我得到了";无效谓词";错误:

bash-4.2$ python3 xsearch.py sample.xml
Traceback (most recent call last):
File "/usr/lib64/python3.6/xml/etree/ElementPath.py", line 263, in iterfind
selector = _cache[cache_key]
KeyError: (".//Item[.='c item']/../..", None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "xsearch.py", line 8, in <module>
for request in root.findall(".//Item[.='c item']/../.."):
File "/usr/lib64/python3.6/xml/etree/ElementPath.py", line 304, in findall
return list(iterfind(elem, path, namespaces))
File "/usr/lib64/python3.6/xml/etree/ElementPath.py", line 277, in iterfind
selector.append(ops[token[0]](next, token))
File "/usr/lib64/python3.6/xml/etree/ElementPath.py", line 233, in     prepare_predicate
raise SyntaxError("invalid predicate")
SyntaxError: invalid predicate

有人能指出我哪里搞错了吗?

通常,XPath的无效谓词错误意味着XPath的一个谓词([]之间的代码(存在语法错误。

具体来说,有两个问题:

  1. SyntaxError("invalid predicate")是因为谓词中有一个额外的)

    for request in root.findall(".//Item[.='c item')]/../.."):
    ^
    

    还请注意,您可以提升谓词以避免向下导航,然后再向上导航(../..(:

    代替

    .//Item[.='c item']/../..
    

    考虑

    .//Request[Items/Item = 'c item']
    

    以选择具有目标CCD_ 9的CCD_。

  2. 您正在使用的XPath库ElementTree并不是XPath标准的完整实现。您可能会浪费大量时间来确定ElementTree支持什么(".//Items[Item='c item']/.."恰好在这里工作(和不支持什么,但最好只使用一个更兼容的库,如lxml。

最新更新