使用ElementTree解析特定项目的XML

时间:2017-07-15 22:48:48

标签: python xml elementtree

我正在向Salesforce合并API发出请求并获得如下响应:

xml_result = '<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com">
    <soapenv:Header>
        <LimitInfoHeader>
            <limitInfo>
                <current>62303</current>
                <limit>2680000</limit><type>API REQUESTS</type></limitInfo>
        </LimitInfoHeader>
    </soapenv:Header>
    <soapenv:Body>
        <mergeResponse>
            <result>
                <errors>
                    <message>invalid record type</message>  
                    <statusCode>INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY</statusCode>
                </errors>
                <id>003skdjf494244</id>
                <success>false</success>
           </result>
        </mergeResponse>
    </soapenv:Body>
</soapenv:Envelope>'

我希望能够解析此响应,如果success = false,则返回错误,statusCode和消息文本。

我尝试了以下内容:

import xml.etree.ElementTree as ET
tree = ET.fromstring(xml_result)

root.find('mergeResponse')
root.find('{urn:partner.soap.sforce.com}mergeResponse')
root.findtext('mergeResponse')
root.findall('{urn:partner.soap.sforce.com}mergeResponse')

...以及findfindtextfindall的其他一些变体,但我似乎无法让这些变体返回任何结果。这是我被卡住的地方。我试图遵循ElementTree文档,但我不明白如何解析特定元素的树。

1 个答案:

答案 0 :(得分:1)

  

Element.find()查找具有特定标记的第一个子项   https://docs.python.org/2/library/xml.etree.elementtree.html#finding-interesting-elements

由于mergeResponse是后代,而不是孩子,因此在这种情况下应使用XPath语法:

root.find('.//{urn:partner.soap.sforce.com}mergeResponse')

将返回您的节点。 .//搜索从当前节点开始的所有后代(在本例中为根)。