首页 > 解决方案 > 在python中评估Xpath2.0

问题描述

我有一个 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转换为 python,但我仍然可以将 xpath2.0 表达式拆分为词法分析器,但无法将其完全转换为 python。

建议我一些用于 python 的 Xpath2.0 库,如果有的话。另外如何解释 XPath 表达式并显示表达式的哪一部分有效?

标签: pythonxpathxslt-2.0xpath-2.0

解决方案


如您所知,lxml是 Python 的 XML/XPath 支持的基石,仅具有功能

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

我们还有一些选择。

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

  1. 带有 XPath 2+ 和 EXSLT 扩展的 Python 模块(例如,用于正则表达式匹配的EXSLTPiPy 上 有一些模块部分提供 XPath 2.0+ 功能。

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

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

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

  5. 另一种选择是将XSLT /XPath/XQuery 与 saxon 和/或Jython中的其他Java XML 类一起使用。

  6. 最后,您可以设置一个 Web 服务,使用 Java、.NET 等语言为您完成繁重的工作,并附带适当的 XPath 3+ 支持(Kay在此处也建议)。

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


推荐阅读