将数据动态附加到我的xml SOAP消息

时间:2016-04-30 18:57:09

标签: python xml string soap

我通过执行字符串格式化来发送xml请求来调用API:

data = '''<?xml version="1.0" encoding="utf-8"?>
             <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
         <SOAP-ENV:Body>
             <ns2:MultiAvailabilityRequest xmlns:m="http://www.derbysoft.com/doorway" Password="CoolJoe" Token="{token}" UserName="CoolJoe"> 
         <ns2:MultiAvailabilityCriteria NumberOfUnits="{units}">
         <ns2:StayDateRange CheckIn="2016-05-02" CheckOut="2016-05-04"/> 
         <ns2:GuestCounts>
           <ns2:GuestCount AdultCount="{adultcount}"/>
           </ns2:GuestCounts> 
         <ns2:HotelCodes>
           <ns2:HotelCode>{hotelcode}</ns2:HotelCode> 
         </ns2:HotelCodes>
         </ns2:MultiAvailabilityCriteria>
      </ns2::MultiAvailabilityRequest>
     </SOAP-ENV:Body>
     </SOAP-ENV:Envelope>'''.format(token=token, units=units, adultcount=adultcount, hotelcode=hotelcode)                                                                                                                                    

上面的代码工作正常并获得不同酒店代码,令牌等的价值,并根据它们显示结果。

但是,我还有一个不同的要求,其中酒店代码可能超过1(2,3或更多)。并且,所需的xml将如下所示:

data = '''<?xml version="1.0" encoding="utf-8"?>
             <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
         <SOAP-ENV:Body>
             <ns2:MultiAvailabilityRequest xmlns:m="http://www.derbysoft.com/doorway" Password="CoolJoe" Token="{token}" UserName="CoolJoe"> 
         <ns2:MultiAvailabilityCriteria NumberOfUnits="{units}">
         <ns2:StayDateRange CheckIn="2016-05-02" CheckOut="2016-05-04"/> 
         <ns2:GuestCounts>
           <ns2:GuestCount AdultCount="{adultcount}"/>
           </ns2:GuestCounts> 
         <ns2:HotelCodes>
           <ns2:HotelCode>{hotelcode1}</ns2:HotelCode>
           <ns2:HotelCode>{hotelcode2}</ns2:HotelCode> 
           <ns2:HotelCode>{hotelcode3}</ns2:HotelCode>  
         </ns2:HotelCodes>
         </ns2:MultiAvailabilityCriteria>
      </ns2::MultiAvailabilityRequest>
     </SOAP-ENV:Body>
     </SOAP-ENV:Envelope>'''.format(token=token, units=units, adultcount=adultcount)

所以,我的问题是:如何检查两个酒店代码是否存在或两个以上。正如您从第二个xml中可以看到的每个酒店代码,这样的新行加起来:

<ns2:HotelCode>{hotelcode1}</ns2:HotelCode>

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

基本上你应该将过程分为两部分:

  1. 填写酒店代码(如果是一个或多个,则无关紧要):

    hotelcode_string =''.join(['<ns2:HotelCode>{hotelcode}</ns2:HotelCode>'.format(hotelcode=code) for code in set([item["hotelcode"] for item in hotelcode])])

  2. 将酒店代码部分放在xml:

    data = '''.... <ns2:HotelCodes>{hotelcode_string}</ns2:HotelCodes> ...'''.format(token=token, units=units, adultcount=adultcount,hotelcode_string=hotelcode_string)