Python l xml xpath найти узел с text () = concat ('x', 'y') - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь разобрать файл xml с помощью python l xml xpath, структура такая:

<body>
  <tu changedate="20190822T080742Z" creationdate="20190822T085527Z" creationid="blank" changeid="blank">
    <prop type="client"> </prop>
    <prop type="project"> </prop>
    <prop type="domain"> </prop>
    <prop type="subject"> </prop>
    <prop type="corrected">no</prop>
    <prop type="aligned">no</prop>
    <prop type="x-document">Test_EN.docx</prop>
    <prop type="x-Project Id">0001</prop>
    <prop type="x-Product group">A</prop>
    <prop type="x-Product">A</prop>
    <prop type="x-Product">B</prop>
    <prop type="x-TestList">TestValue1</prop>
    <prop type="x-TestList">TestValue2</prop>
    <prop type="x-Sample">SampleText</prop>
    <prop type="x-Test">TestText</prop>
    <prop type="x-Name">TestName</prop>

для динамического поиска узлов с помощью функции, которую я сохраняю и значения узлов, которые я ищу, в имена переменных.

node_name = x-Sample
node_value = SampleText
xpath_expression = f'//body/tu/prop[@type="{node_name}"][text()="{node_value}"]'
elements = tree.xpath(xpath_expression)

Проблема в том, что node_value может содержать двойные кавычки и, следовательно, создает недопустимое выражение xpath. Поскольку я застрял с l xml и он использует xpath 1.0, я не могу избежать их в строке.

Просматривая stackoverflow, я обнаружил, что, по-видимому, это можно сделать только в xpath 1.0 с помощью concat. Я также нашел следующую опубликованную функцию:

def xpath_string_escape(input_str):
    """ creates a concatenation of alternately-quoted strings that is always a valid XPath expression """
    parts = input_str.split('"')
    return "concat('" + "', \"'\" , '".join(parts) + "', '')"

, которая затем дает мне следующее:

xpath_expression = '//body/tu/tuv/prop[@type="x-Sample"][text()="concat('SampleText', '')"]'

Однако это не возвращает узлы, которые я ищу.

1 Ответ

0 голосов
/ 08 мая 2020

Альтернатива. Вы можете удалить двойные кавычки из значения вашего узла с помощью:

node_value = translate(//prop[@type="x-Sample"]/text(),'"',"")

Затем используйте contains () вместо text () для построения выражения XPath:

xpath_expression = f'//body/tu/prop[@type="{node_name}"][contains(.,"{node_value}")]'
...