在python中评估Xpath2.0
Posted
技术标签:
【中文标题】在python中评估Xpath2.0【英文标题】:Evaluate Xpath2.0 in python 【发布时间】: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 表达式并显示表达式的哪一部分起作用?
【问题讨论】:
lxml.de/xpathxslt.html#xpath 是一个很好的库,或者只是docs.python.org/3.7/library/… 是的,我试过了。它仅支持 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 实现。 【参考方案1】:如您所知,lxml,Python 支持 XML/XPath 的基石,仅提供功能
XPath 1.0、XSLT 1.0 和通过 libxml2 和 libxslt 的 EXSLT 扩展
我们还有一些选择。
我最近研究了这个主题(特别是 Python 的 XQuery 支持)。 有关XML Query Implementations 的参考列表,请参阅 W3C。
带有 XPath 2+ 和 EXSLT 扩展的 Python 模块(例如,EXSLT 用于正则表达式 matching)some modules on PiPy 部分提供 XPath 2.0+ 功能。
有一些 OSS XML/NoSQL-DBMS 实现了 XPath/XQuery 2.0 功能,例如
Zorba,XQuery 1.0/2.0 的开源可移植可嵌入 C++ 实现,具有 Python 绑定(这 question 有一些指针), 以及 Sedna 和一些商业 DBMS。根据您的项目,这可能是一个不错的选择。我相信 Saxon/C (by Michael Kay) 与 Cython 是最有前途的道路。 在使用Boost.Python 和pysaxon 之前尝试过。更新:同时发布了Saxon/C extension for Python 3。
您可以使用子进程调用 CLI XML 处理器(建议 here),例如subprocess.call(["saxon", "-o:output.xml", "-s:file.xml", "file.xslt"])
另一种选择是将XSLT/XPath/XQuery 与撒克逊语和/或Jython 中的其他Java XML classes 一起使用。
1234563 )。仍然有些令人失望,尤其是对于像 Python 这样的大型语言。
【讨论】:
【参考方案2】:正如 Martin 所说,我们有一个用于 C/C++/php 语言的 Saxon 产品,称为 Saxon/C,现在已经推出了几年。我们一直看到用户对将 Saxon/C 与 Python 结合使用感兴趣。
一位用户已成功使用 Boost.Python 与我们的 C++ 库进行交互。 另一个用户以不同的方式完成了接口:https://github.com/ajelenak/pysaxon
我们希望为 Python 提供官方 Saxon/C 接口。
【讨论】:
一个用于 Python 的官方 Saxon/C 接口会很棒。 我们现在为 Python3 发布了 Saxon/C 扩展:saxonica.com/saxon-c/index.xml以上是关于在python中评估Xpath2.0的主要内容,如果未能解决你的问题,请参考以下文章