簡體   English   中英

Python lxml xpath 用 text()=concat('x', 'y') 查找節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM