如何在Python中使用SOAP API(XML格式)?

时间:2019-06-04 00:10:30

标签: python soap

我以前从未使用过SOAP API。与REST API不同,在Python中使用SOAP API似乎并不那么简单。由于REST API带有JSON格式,因此您只需执行类似data.student.name的操作即可访问。我有以下XML格式附带的SOAP API。

有人能解释我如何在Python代码级别的数据中访问Rank吗?

数据(SOAP API)

<?xml version="1.0" ?>
<Awis>
  <OperationRequest>
    <RequestId>6153688e-865c-11e9-84c7-196fdec7da01</RequestId>
  </OperationRequest>
  <Results>
    <Result>
      <Alexa>
        <Request>
          <Arguments>
            <Argument>
              <Name>url</Name>
              <Value>sfgate.com</Value>
            </Argument>
            <Argument>
              <Name>responsegroup</Name>
              <Value>Rank</Value>
            </Argument>
          </Arguments>
        </Request>
        <TrafficData>
          <DataUrl>sfgate.com/</DataUrl>
          <Rank>1441</Rank>
        </TrafficData>
      </Alexa>
    </Result>
    <ResponseStatus>
      <StatusCode>200</StatusCode>
    </ResponseStatus>
  </Results>
</Awis>

1 个答案:

答案 0 :(得分:0)

回答有点晚,但它可能会帮助有类似问题的人。

问题中的响应来自 Alexa AWIS API,它返回 XML 格式的响应,该响应需要以某种 JSON 或 python dict 格式进行解析以访问其中的值。< /p>

我也遇到了这个问题并通过使用这个函数解析来解决它,它使用 xmltodict 库将 XML 解析为 dict,然后递归修复 dict 键。

def xml_to_json(xml_str):
    
    def fix_dict(a_dict):
        new_dict = a_dict.copy()
        for k,v in a_dict.items():
            
            if k.startswith('aws:'):
                k = k[4:]
                del new_dict["aws:"+k]
            
            if k.startswith("@"):
                del new_dict[k]
                continue
                
            if type(v) == dict:
                v = fix_dict(v)
            elif type(v) == list:
                v = [fix_dict(i) for i in v if type(i)==dict]

            new_dict.update({k:v})

        return new_dict
    
    parsed_dict = xmltodict.parse(xml_str, dict_constructor=dict, cdata_key='text')
    fixed_dict = fix_dict(parsed_dict)
    return fixed_dict