【问题标题】:Evaluate Xpath2.0 in python在python中评估Xpath2.0
【发布时间】:2019-03-13 10:20:33
【问题描述】:

我有一个如下所示的 XPath 表达式。

if(replace(//p[1]/text(),'H','h') = 'hello') then //p[1]/text() else if(//p[1]/text() = 'world') then //p[2]/text() else 'notFound'

我想显示哪个 'if' 表达式有效。

e.g //p[1]/text() if first 'if' expression worked.

'If' 表达式可以嵌套 if、for 循环和 xpath2.0 函数。

我找不到任何用于 python 的 xpath2.0 库。所以我尝试将这个 Js library 转换为 python 仍然可以将 xpath2.0 表达式拆分为词法分析器,但不能将其完全转换为 python。

如果有的话,给我推荐一些用于 python 的 Xpath2.0 库。 还有如何解释 XPath 表达式并显示表达式的哪一部分起作用?

【问题讨论】:

  • 是的,我试过了。它仅支持 xpath1.0 表达式,我对其进行了扩展以支持 xpath 2.0 函数,例如替换、标记化,但无法评估 'if' 和 'for' 表达式。
  • Saxon 9.8 支持 XPath 3 和 2,并且可以在 saxonica.com/download/c.xml 获得 Saxon/C 版本,因此其他 Python 库是用 C 编写的,因此可以基于Saxon/C,至少对于 XPath 2/3 评估,不确定您将深入研究 XPath 实现。

标签: python xpath xslt-2.0 xpath-2.0


【解决方案1】:

如您所知,lxml,Python 支持 XML/XPath 的基石,仅提供功能

XPath 1.0、XSLT 1.0 和通过 libxml2 和 libxslt 的 EXSLT 扩展

我们还有一些选择。

我最近研究了这个主题(特别是 Python 的 XQuery 支持)。
有关XML Query Implementations 的参考列表,请参阅 W3C。

  1. 带有 XPath 2+ 和 EXSLT 扩展的 Python 模块(例如,EXSLT 用于正则表达式 matching)
    some modules on PiPy 部分提供 XPath 2.0+ 功能。

  2. 有一些 OSS XML/NoSQL-DBMS 实现了 XPath/XQuery 2.0 功能,例如

    • Zorba,XQuery 1.0/2.0 的开源可移植可嵌入 C++ 实现,具有 Python 绑定(这 question 有一些指针),
    • 以及 Sedna 和一些商业 DBMS。根据您的项目,这可能是一个不错的选择。
  3. 我相信 Saxon/C (by Michael Kay) 与 Cython 是最有前途的道路。
    在使用Boost.Pythonpysaxon 之前尝试过。
    更新:同时发布了Saxon/C extension for Python 3

  4. 您可以使用子进程调用 CLI XML 处理器(建议 here),例如subprocess.call(["saxon", "-o:output.xml", "-s:file.xml", "file.xslt"])

  5. 另一种选择是将XSLT/XPath/XQuery 与撒克逊语和/或Jython 中的其他Java XML classes 一起使用。

  6. 1234563 )。

仍然有些令人失望,尤其是对于像 Python 这样的大型语言。

【讨论】:

    【解决方案2】:

    正如 Martin 所说,我们有一个用于 C/C++/PHP 语言的 Saxon 产品,称为 Saxon/C,现在已经推出了几年。我们一直看到用户对将 Saxon/C 与 Python 结合使用感兴趣。

    一位用户已成功使用 Boost.Python 与我们的 C++ 库进行交互。 另一个用户以不同的方式完成了接口:https://github.com/ajelenak/pysaxon

    我们希望为 Python 提供官方 Saxon/C 接口。

    【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多