【问题标题】:Using for expression inside xpath expression lxml在 xpath 表达式 lxml 中使用 for 表达式
【发布时间】:2020-07-09 06:45:33
【问题描述】:

有没有办法在lxml 中使用带有.xpath 方法的for 表达式?

如果我有类似的 xml

<DataGrid>
   <row>
      <description>Map to blank.</description>
      <rule />
   </row>
   <row>
      <description>The Vehicle Identification Number.</description>
      <rule>PRINT VIN</rule>
   </row>
</DataGrid>

有没有办法直接使用lxml运行这个xpath表达式

for $var in //DataGrid/row return concat($var/rule/text(), '%%', $var/description/text())

我希望得到一个包含两个字符串的列表:["'%%Map to blank.'", "'PRINT VIN%%The Vehicle Identification Number.'"]

运行 root.xpath('for $var in //DataGrid/row return concat($var/rule/text(), '%%', $var/description/text())') 会导致此回溯

---------------------------------------------------------------------------
XPathEvalError                            Traceback (most recent call last)
<ipython-input-84-a37be007325f> in <module>
----> 1 root.xpath("for $var in //DataGrid/row return concat($var/rule/text(), '%%', $var/description/text())")

src/lxml/etree.pyx in lxml.etree._ElementTree.xpath()

src/lxml/xpath.pxi in lxml.etree.XPathDocumentEvaluator.__call__()

src/lxml/xpath.pxi in lxml.etree._XPathEvaluatorBase._handle_result()

XPathEvalError: Invalid expression

或者 - lxml 不是适合这个的库吗?或者是否有任何其他库可以直接在 XML 文件上运行这些 xpath 表达式?

【问题讨论】:

  • 你的问题到底是什么?
  • 如何获得我想要的输出?我无法在 XML 上运行 xpath 表达式。它适用于简单的表达式,但像 ForExpr 这样的东西似乎不起作用。
  • 你用python for循环试过了吗
  • 不确定这有什么帮助。不能使用 lxml 运行任意 xpath 1.0 表达式吗?文档中没有提到任何此类情况。我的用例涉及让用户输入 xpath 表达式(他们可以输入任何表达式)
  • lxml 支持 XPath 1.0。在 XPath 2.0 中添加了 for 表达式。

标签: python python-3.x xpath lxml


【解决方案1】:

也许我遗漏了一些东西,但使用 lxml 应该是可行的:

dg = """[your xml above]"""
from lxml import etree

doc = etree.XML(dg)

my_vars = doc.xpath('//row')
for a_var in my_vars:
    print(a_var.xpath("concat(./rule/text(),' %% ', ./description/text())"))

输出:

%% Map to blank.
PRINT VIN %% The Vehicle Identification Number.

【讨论】:

  • 我的用例是用户将运行自己的表达式进行评估。这里的问题是我没有意识到 lxml(和 libxml2)只支持 XPath 1.0 语法,而 for .. return 表达式是在 XPath 2.0 中引入的。
  • @wkgrcdsam 用户需要使用for ... return 表达式还是可以使用任何xpath 表达式?
  • 他们可以使用任何 xpath 表达式。该项目处于概念验证阶段,即灵活的要求。因此,如果我们需要将其限制为 XPath 1.0,我们可以这样做。
  • @wkgrcdsam 很有趣。由于您处于 PoC 阶段,因此我实际上会尝试反其道而行之:xpath/xquery 3.1(当前版本)比 1.0 强大得多。如果您仅限于使用 python(或 php 或 nodejs),那么在大多数情况下,您将被困在 1.0 中。但如果不是,那么根据 xml 数据的来源和数量,您可能需要使用支持 3.1 的专用 xml 数据库(如 BaseX)。另一种选择是 xidel,一个 cli 实用程序。无论哪种情况,用户编写自己的表达式都需要他们完全熟悉 xpath。
猜你喜欢
  • 2011-02-14
  • 2013-07-10
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多