Python XPath语法错误:无效谓词
我有这样一个XML文件:Python XPath语法错误:无效谓词,python,python-3.x,xml,xpath,Python,Python 3.x,Xml,Xpath,我有这样一个XML文件: $ cat sample.xml <Requests> <Request> <ID>123</ID> <Items> <Item>a item</Item> <Item>b item</Item&
$ 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>
我得到“无效谓词”错误:
bash-4.2$python3 xsearch.py sample.xml
回溯(最近一次呼叫最后一次):
文件“/usr/lib64/python3.6/xml/etree/ElementPath.py”,第263行,在iterfind中
选择器=\u缓存[缓存\u键]
KeyError:(“//Item[..='c Item']/../”,无)
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“xsearch.py”,第8行,在
对于root.findall(“.//Item[.='c Item']/../…”)中的请求:
findall中的文件“/usr/lib64/python3.6/xml/etree/ElementPath.py”,第304行
返回列表(iterfind(元素、路径、名称空间))
文件“/usr/lib64/python3.6/xml/etree/ElementPath.py”,第277行,在iterfind中
selector.append(ops[token[0]](下一步,token))
prepare_谓词中的文件“/usr/lib64/python3.6/xml/etree/ElementPath.py”,第233行
引发语法错误(“无效谓词”)
SyntaxError:无效谓词
有人能指出我哪里弄错了吗?一般来说,XPath无效谓词错误意味着XPath的一个谓词在语法上有问题,即[
和]
之间的代码
具体来说,在您的案例中,有两个问题:
语法错误(“无效谓词”)
是因为谓词中有一个额外的)
:
for request in root.findall(".//Item[.='c item')]/../.."):
^
还请注意,您可以提升谓词以避免向下导航,然后再进行备份(。/…
):
而不是
.//Item[.='c item']/../..
考虑
.//Request[Items/Item = 'c item']
选择带有目标项的请求
元素
“//Items[Item='c Item']/..”
在这里正好工作)和不支持什么,但最好使用更兼容的库,例如
[
和]
之间的代码
具体来说,在您的案例中,有两个问题:
语法错误(“无效谓词”)
是因为谓词中有一个额外的)
:
for request in root.findall(".//Item[.='c item')]/../.."):
^
还请注意,您可以提升谓词以避免向下导航,然后再进行备份(。/…
):
而不是
.//Item[.='c item']/../..
考虑
.//Request[Items/Item = 'c item']
选择带有目标项的请求
元素
“//Items[Item='c Item']/..”
在这里正好工作)和不支持什么,但最好使用更兼容的库,例如
在XML的末尾插入<代码>这篇文章中的
是错误还是原因。谢谢。我修复了它,但错误仍然存在。请删除XML的结尾<代码>这篇文章中的
是错误还是原因。谢谢。我已修复,但错误仍然存在。谢谢您的建议。但是在我删除额外的“)”之后,同样的错误仍然存在。如果没有额外的“)
,谓词就可以了。也许是新的打字错误?复制(不要重新键入)您的确切代码到问题中,作为更新,也许我们可以发现新问题。我重新复制了代码和输出。你能复习一下吗。我还尝试了第二种方法,错误完全相同。你可以在回答问题后添加问题,但在问题中更正代码以应用答案中建议的解决方案是非常不礼貌的,这会使新读者无法遵循该思路。谢谢你的建议。但是在我删除额外的“)”之后,同样的错误仍然存在。如果没有额外的“)
,谓词就可以了。也许是新的打字错误?复制(不要重新键入)您的确切代码到问题中,作为更新,也许我们可以发现新问题。我重新复制了代码和输出。你能复习一下吗。我还尝试了第二种方法,错误完全相同。在回答问题后,你可以添加问题,但在问题中更正代码以应用答案中建议的解决方案是非常不礼貌的,这使得新读者无法遵循该思路。