Использование для выражения внутри выражения xpath lxml - PullRequest
0 голосов
/ 09 июля 2020

Есть ли способ использовать выражение for с методом .xpath в lxml?

Если у меня есть xml like

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

Есть ли способ чтобы запустить это выражение xpath напрямую, используя lxml

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

В качестве альтернативы - l xml не подходящая библиотека для этого? или есть ли какая-либо другая библиотека, в которой я могу запускать эти выражения xpath непосредственно в файле XML?

1 Ответ

0 голосов
/ 09 июля 2020

Может быть, мне чего-то не хватает, но это должно быть выполнено с l xml:

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.
...