Я пытаюсь разобрать файл 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', '')"]'
Однако это не возвращает узлы, которые я ищу.