如何迭代 XML 值以使用迭代值进行 XML API 调用?

How to iterate through XML values to make XML API call with iterative values?

我正在开展一个项目,通过此 API (http://www.yourmembership.com/company/api-reference/) 提取数据。 API 要求通过 XML 进行调用。我已经成功地能够使用 python 中的 'requests' 库通过 HTTP 响应对象进行调用和检索数据。

我的问题是我想开发一个函数,它将迭代来自一个 API 调用的 ID,并将它们插入另一个函数,该函数将进行迭代 API 调用以获取更多关于每个调用的数据身份证.

例如,我现在拥有的脚本为我提供了所有事件 ID 的转储:

import requests

xml ="""

<?xml version="1.0" encoding="UTF-8"?>
<YourMembership>
   <Version>2.25</Version>
   <ApiKey></ApiKey>
   <CallID>008</CallID>
   <></>
   <SaPasscode></SaPasscode>
   <Call Method = "Sa.Events.All.GetIDs">
       <StartDate>2017/01/1</StartDate>
       <EndDate>2017/12/31</EndDate>
   </Call>
</YourMembership>
"""


headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://api.yourmembership.com', data=xml,headers=headers)
print(r.text)

'print(r.text)' 的响应看起来像这样(没有子对象):

<EventID>12345</EventID>
<EventID>67890</EventID>
<EventID>24680</EventID>
<EventID>13579</EventID>
<EventID>08642</EventID>

我如何获取这些 event_IDs 并遍历响应对象并将它们插入下面的这个函数(函数不完整,草稿)并通过迭代获取每个 event_ID 的信息XML API 通过某种方式插入字段的值进行调用 ?

import requests
def xml_event_info():
xml ="""

<?xml version="1.0" encoding="UTF-8"?>
<YourMembership>
   <Version>2.25</Version>
   <ApiKey>xxx-xxx</ApiKey>
   <CallID>001</CallID>
   <></>
   <SaPasscode>xxxx</SaPasscode>
   <Call Method = "Sa.Events.Event.Get">
       <EventID>12345</EventID>
   </Call>
</YourMembership>
"""


headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://api.yourmembership.com', data=xml,headers=headers)
print(r.text)

在此先感谢您,如果我的问题没有意义,请告诉我。

编辑:

<YourMembership_Response>
<ErrCode>0</ErrCode>
<ExtendedErrorInfo></ExtendedErrorInfo>
<Sa.Events.All.GetIDs>
<EventID>98765</EventID>
</Sa.Events.All.GetIDs>
</YourMembership_Response>

考虑连接 Python 的内置 etree 以解析 YM_Response 并提取 EventID 示例中的文本:

import xml.etree.ElementTree as et

txt="""
<YourMembership_Response>
    <ErrCode>0</ErrCode>
    <ExtendedErrorInfo></ExtendedErrorInfo>
    <Sa.Events.All.GetIDs>
        <EventID>98765</EventID>
    </Sa.Events.All.GetIDs>
</YourMembership_Response>
"""

dom = et.fromstring(txt)

for i in dom.iterfind('.//EventID'):    
    print(i.text)   
# 98765

总而言之,迭代调用将事件 ID 作为参数传递的方法,然后将字符串格式化为 XML 字符串。请参阅 XML 字符串中的大括号,然后是 requests 行中的 .format

import requests
import xml.etree.ElementTree as et

def xml_event_info(eventID):       
    xml ='''        
    <?xml version="1.0" encoding="UTF-8"?>
    <YourMembership>
       <Version>2.25</Version>
       <ApiKey>xxx-xxx</ApiKey>
       <CallID>001</CallID>
       <></>
       <SaPasscode>xxxx</SaPasscode>
       <Call Method = "Sa.Events.Event.Get">
           <EventID>{}</EventID>
       </Call>
    </YourMembership>        
    '''        
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    r = requests.post('https://api.yourmembership.com', 
                      data=xml.format(eventID), headers=headers)        
    print(r.text)      


xml ='''    
<?xml version="1.0" encoding="UTF-8"?>
<YourMembership>
   <Version>2.25</Version>
   <ApiKey>xxxxx</ApiKey>
   <CallID>008</CallID>
   <></>
   <SaPasscode>xxxx</SaPasscode>
   <Call Method = "Sa.Events.All.GetIDs">
       <StartDate>2017/01/1</StartDate>
       <EndDate>2017/12/31</EndDate>
   </Call>
</YourMembership>
'''        
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
r = requests.post('https://api.yourmembership.com', data=xml, headers=headers)

# BUILD XML TREE OBJECT    
dom = et.fromstring(r.text)

# PARSE EVENT ID TEXT AND PASS INTO FUNCTION
for i in dom.iterfind('.//EventID'):    
    xml_event_info(i.text)