簡體   English   中英

使用 lxml 提取 xml 標記值,使用 Python 提取 xpath

[英]Extract xml tag value using lxml and xpath using Python

我有一個要求,我必須使用 lxml 和 xpath 提取 XML 數據。 我需要使用 lxml 和 xpath 提取 EventId = 122157660。

<B2B_DATA>
   <B2B_METADATA>
       <EventId>122157660</EventId>
       <MessageType>Request</MessageType>
   </B2B_METADATA>
<PAYLOAD>
    <![CDATA[<?xml version="1.0"?>
        <REQUEST_GROUP MISMOVersionID="1.1.1">
            <REQUESTING_PARTY _Name="CityBank" _StreetAddress="801 Main St" _City="rockwall" _State="MD" _PostalCode="11311" _Identifier="416">
                <CONTACT_DETAIL _Name="XX Davis">
                    <CONTACT_POINT _Type="Phone" _Value="1236573348"/>
                    <CONTACT_POINT _Type="Email" _Value="jXX@city.com"/>
                </CONTACT_DETAIL>
            </REQUESTING_PARTY>
        </REQUEST_GROUP>]]>
</PAYLOAD>
</B2B_DATA>

我可以使用循環和迭代器來做到這一點,但想使用 xpath 來獲得更簡潔/更短的代碼。 我也使用lxml來解析CDATA,所以盡量避免使用ElementTree lib。

這就是我嘗試過的 -

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')

root = tree.getroot()

 

for neighbor in root.iter('B2B_METADATA'):

    for element in neighbor:

        if element.tag == 'EventId':

            print(element.text)

請求的 O/P:EventId 122157660

實際上對於非常簡單的查詢,內置的 etree 支持有限的 XPath

print(root.findall('.//B2B_METADATA/EventId')[0].text)

類似於 lxml 的xpath

print(root.xpath('//B2B_METADATA/EventId')[0].text)

或通過解析的對象:

print(root.find('B2B_METADATA').find('EventId').text)

要將您的迭代器向下移動到 XPath,您可以使用如下內容:

result = tree.xpath('/B2B_DATA/B2B_METADATA/EventId/text()')

這將返回 XML 中的EventId元素(嵌套在B2B_METADATA元素中,嵌套在B2B_DATA元素中)中包含的文本節點的字符串表示形式,即122157660 如果 XML 中有多個這樣的文本節點,那么xpath方法會將它們全部作為字符串列表返回。

如果您知道EventId只出現在/B2B_DATA/B2B_METADATA ,那么您可以將 XPath 縮短為//EventId/text() 它的計算效率會降低,因為//會在整個文檔中搜索EventId元素,但是您可能會重視簡潔而不是效率,特別是如果 XML 文檔非常小(如您的示例)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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