Python XPath语法错误:无效谓词

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&

我有这样一个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>
我得到“无效谓词”错误:

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']
    
    选择带有目标
    项的
    请求
    元素

  • 您正在使用的XPath库。您可能会浪费大量时间试图确定ElementTree支持什么(
    “//Items[Item='c Item']/..”
    在这里正好工作)和不支持什么,但最好使用更兼容的库,例如

  • 一般来说,XPath无效谓词错误意味着XPath的一个谓词在语法上有问题,即
    [
    ]
    之间的代码

    具体来说,在您的案例中,有两个问题:

  • 语法错误(“无效谓词”)
    是因为谓词中有一个额外的

     for request in root.findall(".//Item[.='c item')]/../.."):
                                                    ^
    
    还请注意,您可以提升谓词以避免向下导航,然后再进行备份(
    。/…
    ):

    而不是

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

     .//Request[Items/Item = 'c item']
    
    选择带有目标
    项的
    请求
    元素

  • 您正在使用的XPath库。您可能会浪费大量时间试图确定ElementTree支持什么(
    “//Items[Item='c Item']/..”
    在这里正好工作)和不支持什么,但最好使用更兼容的库,例如


  • 在XML的末尾插入<代码>这篇文章中的
    是错误还是原因。谢谢。我修复了它,但错误仍然存在。请删除XML的结尾<代码>这篇文章中的
    是错误还是原因。谢谢。我已修复,但错误仍然存在。谢谢您的建议。但是在我删除额外的“)”之后,同样的错误仍然存在。如果没有额外的“
    ,谓词就可以了。也许是新的打字错误?复制(不要重新键入)您的确切代码到问题中,作为更新,也许我们可以发现新问题。我重新复制了代码和输出。你能复习一下吗。我还尝试了第二种方法,错误完全相同。你可以在回答问题后添加问题,但在问题中更正代码以应用答案中建议的解决方案是非常不礼貌的,这会使新读者无法遵循该思路。谢谢你的建议。但是在我删除额外的“)”之后,同样的错误仍然存在。如果没有额外的“
    ,谓词就可以了。也许是新的打字错误?复制(不要重新键入)您的确切代码到问题中,作为更新,也许我们可以发现新问题。我重新复制了代码和输出。你能复习一下吗。我还尝试了第二种方法,错误完全相同。在回答问题后,你可以添加问题,但在问题中更正代码以应用答案中建议的解决方案是非常不礼貌的,这使得新读者无法遵循该思路。