在Python中评估XPath 2.0

13

我有一个如下所示的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表达式并显示哪部分表达式起作用?"

https://lxml.de/xpathxslt.html#xpath 是一个很好的库,或者简单地使用 https://docs.python.org/3.7/library/xml.etree.elementtree.html#xpath-support。 - Risadinha
1
我试过了。它只支持xpath1.0表达式,但我扩展了它以支持xpath 2.0函数,如replace、tokenize,但无法评估“if”和“for”表达式。 - Er Bharath Ram
Saxon 9.8支持XPath 3和2,并且在http://saxonica.com/download/c.xml上提供Saxon/C版本,因此由于其他Python库是用C编写的,所以可能可以基于Saxon/C构建一个Python库,至少可以进行XPath 2/3评估,不确定您能够深入了解XPath实现的程度。 - Martin Honnen
2个回答

14

如您所知,lxml是Python的XML/XPath支持的基石,只支持XPath 1.0、XSLT 1.0和通过libxml2和libxslt支持的EXSLT扩展。

但我们仍有一些选择。

我最近研究了这个主题(具体来说是Python的XQuery支持)。 请参阅W3C的XML查询实现参考列表。

  1. 使用XPath 2+和EXSLT扩展的Python模块(例如用于正则表达式matching的EXSLT)
    在PiPy上有一些模块部分提供XPath 2.0+功能。

  2. 有一些实现XPath/XQuery 2.0函数的OSS XML/NoSQL-DBMS,例如

    • Zorba,一个开源的可嵌入C++实现XQuery 1.0/2.0的平台,具有Python绑定(这个question提供了一些指针),
    • 以及Sedna和一些商业DBMS。根据您的项目,这可能是一个不错的选择。
  3. 我认为使用Michael KaySaxon/C和Cython是最有前途的道路。
    之前曾尝试使用Boost.Pythonpysaxon
    更新:与此同时,已经发布了Python 3的Saxon/C扩展

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

  5. 另一个选项是在Jython中使用saxon和/或其他Java XML类XSLT/XPath/XQuery。

  6. 最后,您可以设置一个Web服务,在像Java、.NET等语言中为您提供适当的XPath 3+支持(Kay在here中也提到了这一点),以便为您完成艰苦的工作。

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


3

正如Martin所提到的,我们有一个针对C/C++/PHP语言的Saxon产品,称为Saxon/C,已经发布了几年。我们一直看到用户对使用Saxon/C与Python感兴趣。

更新2019:现在已经发布了针对Python3的Saxon/C扩展:SaxonC - XML文档处理 for C/C++, PHP and Python

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


1
一个官方的Saxon/C接口适用于Python将是非常棒的。 - Daniel Haley
7
我们现在发布了一个Python3的Saxon/C扩展:http://www.saxonica.com/saxon-c/index.xml - ond1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接