解析在Python SOAP / XML响应(Parsing soap/XML response i

2019-09-29 02:54发布

我试图解析使用Python下面的XML。 我不明白这是哪种类型的XML,因为我从来没有在这种xml.I的刚刚从形式微软API响应工作。

现在的问题是如何解析,并获得价值BinarySecurityToken在我的Python代码。

我指的这个问题与Python解析XML SOAP响应

不过,像这样有也有一些的xmlns来获取文本。但是在我的xml我看不到任何的xmlns附近值透过我能得到的价值。

请让我知道如何让一个特定的值,使用python从下面的XML归档。

<?xml version="1.0" encoding="utf-8" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <S:Header>
    <wsa:Action xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Action" S:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue</wsa:Action>
    <wsa:To xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="To" S:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
    <wsse:Security S:mustUnderstand="1">
      <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TS">
        <wsu:Created>2017-06-12T10:23:01Z</wsu:Created>
        <wsu:Expires>2017-06-12T10:28:01Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </S:Header>
  <S:Body>
    <wst:RequestSecurityTokenResponse xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wst="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:psf="http://schemas.microsoft.com/Passport/SoapServices/SOAPFault">
      <wst:TokenType>urn:passport:compact</wst:TokenType>
      <wsp:AppliesTo xmlns:wsa="http://www.w3.org/2005/08/addressing">
        <wsa:EndpointReference>
          <wsa:Address>https://something.something.something.com</wsa:Address>
        </wsa:EndpointReference>
      </wsp:AppliesTo>
      <wst:Lifetime>
        <wsu:Created>2017-06-12T10:23:01Z</wsu:Created>
        <wsu:Expires>2017-06-13T10:23:01Z</wsu:Expires>
      </wst:Lifetime>
      <wst:RequestedSecurityToken>
        <wsse:BinarySecurityToken Id="Compact0">my token</wsse:BinarySecurityToken>
      </wst:RequestedSecurityToken>
      <wst:RequestedAttachedReference>
        <wsse:SecurityTokenReference>
          <wsse:Reference URI="wwwww=">
          </wsse:Reference>
        </wsse:SecurityTokenReference>
      </wst:RequestedAttachedReference>
      <wst:RequestedUnattachedReference>
        <wsse:SecurityTokenReference>
          <wsse:Reference URI="swsw=">
          </wsse:Reference>
        </wsse:SecurityTokenReference>
      </wst:RequestedUnattachedReference>
    </wst:RequestSecurityTokenResponse>
  </S:Body>
</S:Envelope>

Answer 1:

这个声明是根元素的开始标记的一部分:

xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"

这意味着,与元件wsse前缀(如BinarySecurityToken )处于http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd命名空间。

该解决方案是基本相同的答案链接的问题。 这只是一个命名空间:

import xml.etree.ElementTree as ET

tree = ET.parse('soap.xml')    
print tree.find('.//{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}BinarySecurityToken').text

下面是做这件事的另一种方式:

import xml.etree.ElementTree as ET

ns = {"wsse": "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"}
tree = ET.parse('soap.xml') 
print tree.find('.//wsse:BinarySecurityToken', ns).text

在这两种情况下的输出是my token

见https://docs.python.org/2.7/library/xml.etree.elementtree.html#parsing-xml-with-namespaces 。



Answer 2:

创建一个命名空间字典帮助了我。 感谢您@mzjn用于链接那篇文章。

在我的SOAP响应,我发现我是不必使用完整路径元素提取文本。

例如,我与FEDEX API的工作,而我需要找到一个因素是TrackDetails。 我最初的.find()看上去像.find('{http://fedex.com/ws/track/v16}TrackDetails')

我能简化这为以下内容:

ns = {'TrackDetails': 'http://fedex.com/ws/track/v16'}
tree.find('TrackDetails:TrackDetails',ns)

你看TrackDetails两次,因为我命名的字典的关键TrackDetails,但你能说出这样的东西你想要的。 只是帮助我记得我在我的项目中工作,但之后的TrackDetails :在SOAP响应,我需要实际的元素。

希望这可以帮助别人!



文章来源: Parsing soap/XML response in Python