XPath 语法错误:谓词无效

2024-04-28

我有一个像这样的 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>

我只是想提取 XMLRequest对于其孙元素有一定价值的元素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 的谓词之一(即 XPath 之间的代码)在语法上存在错误。[ and ].

具体就您的情况而言,存在两个问题:

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

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

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

    代替

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

    consider

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

    选择Request具有目标的元素Item.

  2. 您正在使用的 XPath 库,ElementTree,不是 XPath 标准的完整实现 https://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support。您可能会浪费大量时间来尝试确定 ElementTree 所支持的内容(".//Items[Item='c item']/.."碰巧在这里工作)并且不支持,但最好只使用更兼容的库,例如lxml https://lxml.de/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XPath 语法错误:谓词无效 的相关文章

随机推荐

  • 更改故事板中默认后退按钮的文本颜色

    如何更改故事板中默认后退按钮的文本颜色 通过故事板和以编程方式 显示的默认颜色是蓝色 This https stackoverflow com questions 12886274 storyboard uinavigation contr
  • 支持 Javascript 链式关系运算符吗?

    我只是尝试了一些 JS 核心原则 发现引擎评估链式关系运算符时不会抛出错误 相反 他们以一种我自己无法理解的方式进行评估 console log 1 lt 2 lt 3 lt 4 lt 5 true expected console log
  • bash:ssh-host-config:找不到命令

    有谁有任何想法可能导致此问题 我使用的是 win 7 我已经使用本教程成功设置了所有内容 http www kgx net nz 2010 03 cygwin sshd and windows 7 http www kgx net nz 2
  • 向回调函数添加附加参数

    我正在 Node js 中构建一个系统 该系统应该查找文件夹数组中的所有文件 统计它们 然后使用该信息执行一些其他工作 我使用 fs readdir 从每个文件夹同步获取所有文件 我的代码如下所示 for i 0 max paths len
  • JFace DialogCellEditor:如何使按钮始终出现?

    我用的是JFaceDialogCellEditor在 JFace 的一行单元格中显示一个按钮TableViewer激活时会触发一个对话框 此行为适用于以下代码 但仅当显式选择托管按钮的表的单元格时才会显示该按钮 public class C
  • Mongoose VersionError:保存文档时找不到 id 的匹配文档

    通过 sync API 请求同步用户购物车时 我反复看到以下错误 每当用户更改购物车的内容时就会调用此函数 VersionError 找不到 id 的匹配文档 2y4b1hq601cd013e0af25e32 版本4修改路径 购物车 car
  • firebase 崩溃报告上传的符号文件错误

    当崩溃上传到 firebase 仪表板时 它总是显示消息Upload symbol file to symbolicate future stack traces for UUID 不过 我确实通过查看 符号文件 选项卡确保符号文件已上传
  • MVC 4 中的运行时动态捆绑和缩小

    我想知道是否有人可以帮助我使用 MVC 4 附带的新优化命名空间进行捆绑和缩小 我有一个多租户应用程序 我想在其中决定应根据每个用户的设置加载哪些 js 文件 一种方法是预先创建所有包并根据用户的设置更改resolvebundleurl的虚
  • 黄瓜使用标签自动重新运行失败的场景?

    在我们的构建中 某些场景会由于我们无法控制的原因或需要很长时间才能正确调试而失败 诸如异步javascript之类的东西 无论如何 重点是有时它们工作 有时不工作 所以我认为最好向场景添加一个标签 例如 rerun on failure 或
  • Find和FindNext复制所有匹配对应的数据

    我想在工作表 BD 的第 5 列中搜索与工作表 Plan1 上名为 alocacao 的值匹配的所有条目 然后将第 2 列上的值复制到名为 tecnico1 的单元格 其他单元格称为 tecnico2 tecnico3 和 tecnico4
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour
  • Rancher 外部子域

    我需要为 docker 容器中的应用程序设置子域 而不是在内部牧场主网络中 而是供公共使用 我已将域委托给牧场主服务器 并且目录中几乎所有堆栈都有主机属性 但它不起作用 我想我需要使用一些 rancher dns 委托域或设置 nginx
  • 通过DataTrigger设置的TextBox的文本不更新模型中的属性值

    我是 WPF 新手 如果未选中复选框 我想清除文本框的值 我尝试通过数据触发器来做到这一点 下面是代码
  • 有类似 Fabric for Perl 的东西吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我很喜欢Fabric http fabfile org 对于个人项目 但我的日常工作是在面向 Perl
  • 当 UIImagePickerController 卸载我的控制器时如何避免数据丢失?

    我正在使用 UIImagePickerController 从相机拍照 但是 我发现我的调用控制器 显示在 UIImagePickercontroller 之前显示的控制器 随机被卸载 我记录了 viewDidUnload 它确实被调用了
  • python 字典中没有值

    是否可以检查 dict 中的无值 dict a None b 12345 c None My code for k v in d items if d k None print good else print Bad 执行上面的代码片段后打
  • 切换到 zsh 会破坏命令行中的轨道

    我最近刚刚转而使用 zsh 和 oh my zsh 但在使用 Rails 命令行工具时遇到了问题 以下是我执行的步骤以及收到的错误 我运行了github页面提供的curl命令 curl L https github com robbyrus
  • 处理连接重置错误

    我有一个关于在 Python3 中处理 ConnectionResetError 的问题 当我使用 urllib request Request 函数时 通常会发生这种情况 我想知道如果我们遇到这样的错误是否可以重做请求 例如 def ge
  • 在 Presto 中将 array(double) 转换为 varchar

    我正在尝试将 Array double 转换为 Presto 中的 varchar 样本值 99 0 98 0 99 0 95 0 99 0 88 0 90 0 79 0 90 0 56 0 90 0 90 0 92 0 90 0 93 0
  • XPath 语法错误:谓词无效

    我有一个像这样的 XML 文件 cat sample xml