[英]Python lxml xpath find node with text()=concat('x', 'y')
我正在嘗試使用 python lxml xpath 解析 xml 文件,結構如下:
<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>
為了動態查找具有 function 的節點,我將要查找的節點的名稱和值保存到變量名稱中。
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 表達式。 由於我堅持使用 lxml 並且它使用 xpath 1.0 我無法在字符串中轉義它們。
查看stackoverflow,我發現顯然這只能在xpath 1.0中使用concat完成。 我還發現了以下 function 貼:
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', '')"]'
但是,這不會返回我正在尋找的節點。
選擇。 您可以使用以下方法從節點值中刪除雙引號:
node_value = translate(//prop[@type="x-Sample"]/text(),'"',"")
然后使用 contains() 而不是 text() 來構建您的 XPath 表達式:
xpath_expression = f'//body/tu/prop[@type="{node_name}"][contains(.,"{node_value}")]'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.