Raman Balyan Raman Balyan - 6 months ago 9
Python Question

Extract the required XML message in the form of string

I am getting below xml SOAP response from an API. I am using "requests" library to hit the url of API.

SOAP response:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:AvailabilityResponse xmlns:ns2="http://www.derbysoft.com/doorway" Status="Successful" Token="87348a9665ffc984abf37329">
<ns2:Availabilities>
<ns2:Availability CurrencyCode="USD" HotelCode="HY-CHIRC">
<ns2:GuestCount AdultCount="1" ChildCount="0"/>
<ns2:RoomTypes>
<ns2:RoomType RoomTypeCode="KING" RoomTypeName="1 King Bed">
<ns2:RoomTypeDescription>1 King Bed; 1 Grand Bed:Ihome Station:Large Plasma Tv:; Large Workdesk:Comp Gym</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="DLXK" RoomTypeName="High Floor King">
<ns2:RoomTypeDescription>High Floor King; Guaranteed High Floor-25th and Up:350 Sq Ft; 1 King Grand Bed:Oversized Workdesk:Free Wifi</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="VW1K" RoomTypeName="Premium View King">
<ns2:RoomTypeDescription>Premium View King; 1 King Bed:Ihome Station:Large Plasma Tv:; Large Workdesk:Comp Gym</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="CLBK" RoomTypeName="Regency Club King">
<ns2:RoomTypeDescription>Regency Club King; Comp Contl Breakfast:Hors D Oeuvres and Dessert:; Exclusive Club Lounge With View</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="QNQN" RoomTypeName="2 Queen Beds">
<ns2:RoomTypeDescription>2 Queen Beds; 2 Queen Grand Beds:Ihome Station:Plasma Tv:; Large Workdesk:Comp Gym</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="VW2Q" RoomTypeName="Premium View 2 Qen">
<ns2:RoomTypeDescription>Premium View 2 Qen; 2 Queen Beds:Ihome Station:Large Plasma Tv:; Large Workdesk:Comp Gym</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="JRSQ" RoomTypeName="Grand 2 Queens">
<ns2:RoomTypeDescription>Grand 2 Queens; Oversized Corner Room:2 Queen Beds:420 Sq Ft:; 2 Soft Chairs:Sml Table:Large Desk:Free Wifi</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="CLBD" RoomTypeName="Regency Club 2 Double Beds Bd">
<ns2:RoomTypeDescription>Regency Club 2 Double Beds Bd; Comp Contl Breakfast:Hors D Oeuvres and Dessert:; Exclusive Club Lounge With View</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="JRSK" RoomTypeName="Junior City View Suite">
<ns2:RoomTypeDescription>Junior City View Suite; Large Parlor With 1 King Bed Grand Bed:Sitting Area:; Oversize Couch:Large Desk:Plasma Tv</ns2:RoomTypeDescription>
</ns2:RoomType>
<ns2:RoomType RoomTypeCode="DLXD" RoomTypeName="High Fl 2 Double">
<ns2:RoomTypeDescription>High Fl 2 Double; Guaranteed High Floor-25th and Up:350 Sq Ft; 2 Double Beds:Oversized Workdesk:Free Wifi</ns2:RoomTypeDescription>
</ns2:RoomType>
</ns2:RoomTypes>
<ns2:RatePlans>
<ns2:RatePlan RatePlanCode="49584IPRTF" RatePlanName="Partner Rate">
<ns2:RatePlanDescription/>
<ns2:CancelPolicy NonRefundable="false">
<ns2:Description>CXL 24HRS PRIOR TO ARRIVAL TO AVOID 1NT PNLTY</ns2:Description>
<ns2:CancelPenalties>
<ns2:CancelPenalty MaxHoursBeforeCheckIn="24" MinHoursBeforeCheckIn="0" Nights="1" NoShow="false"/>
<ns2:CancelPenalty Nights="1" NoShow="true"/>
</ns2:CancelPenalties>
</ns2:CancelPolicy>
</ns2:RatePlan>
<ns2:RatePlan RatePlanCode="49584WPAWAF" RatePlanName="Bed And Breakfast">
<ns2:RatePlanDescription/>
<ns2:CancelPolicy NonRefundable="false">
<ns2:Description>CXL 24HRS PRIOR TO ARRIVAL TO AVOID 1NT PNLTY</ns2:Description>
<ns2:CancelPenalties>
<ns2:CancelPenalty MaxHoursBeforeCheckIn="24" MinHoursBeforeCheckIn="0" Nights="1" NoShow="false"/>
<ns2:CancelPenalty Nights="1" NoShow="true"/>
</ns2:CancelPenalties>
</ns2:CancelPolicy>
</ns2:RatePlan>
</ns2:RatePlans>
<ns2:RoomRates>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="KING">
<ns2:Rates>
<ns2:Rate AmountAfterTax="178.610" AmountBeforeTax="152.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="DLXK">
<ns2:Rates>
<ns2:Rate AmountAfterTax="198.570" AmountBeforeTax="169.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="VW1K">
<ns2:Rates>
<ns2:Rate AmountAfterTax="218.520" AmountBeforeTax="186.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="CLBK">
<ns2:Rates>
<ns2:Rate AmountAfterTax="233.490" AmountBeforeTax="198.900" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="QNQN">
<ns2:Rates>
<ns2:Rate AmountAfterTax="178.610" AmountBeforeTax="152.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="VW2Q">
<ns2:Rates>
<ns2:Rate AmountAfterTax="218.520" AmountBeforeTax="186.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="JRSQ">
<ns2:Rates>
<ns2:Rate AmountAfterTax="253.450" AmountBeforeTax="215.900" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="CLBD">
<ns2:Rates>
<ns2:Rate AmountAfterTax="233.490" AmountBeforeTax="198.900" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="KING">
<ns2:Rates>
<ns2:Rate AmountAfterTax="208.540" AmountBeforeTax="177.650" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="DLXK">
<ns2:Rates>
<ns2:Rate AmountAfterTax="218.520" AmountBeforeTax="186.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="VW1K">
<ns2:Rates>
<ns2:Rate AmountAfterTax="238.480" AmountBeforeTax="203.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="JRSK">
<ns2:Rates>
<ns2:Rate AmountAfterTax="448.020" AmountBeforeTax="381.650" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="QNQN">
<ns2:Rates>
<ns2:Rate AmountAfterTax="198.570" AmountBeforeTax="169.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="DLXD">
<ns2:Rates>
<ns2:Rate AmountAfterTax="218.520" AmountBeforeTax="186.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="VW2Q">
<ns2:Rates>
<ns2:Rate AmountAfterTax="238.480" AmountBeforeTax="203.150" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
<ns2:RoomRate RatePlanCode="49584WPAWAF" RoomTypeCode="JRSQ">
<ns2:Rates>
<ns2:Rate AmountAfterTax="448.020" AmountBeforeTax="381.650" EffectiveDate="2016-05-13" ExpireDate="2016-05-14"/>
</ns2:Rates>
</ns2:RoomRate>
</ns2:RoomRates>
</ns2:Availability>
</ns2:Availabilities>
</ns2:AvailabilityResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Now, I just want CancelPolicy related to particular RatePlanCode only. Let's say, I just want CancelPolicy of RatePlanCode "49584WPAWAF" then it should return like this and this return XML should be in the form of string.

<ns2:CancelPolicy NonRefundable="false">
<ns2:Description>CXL 24HRS PRIOR TO ARRIVAL TO AVOID 1NT PNLTY</ns2:Description>
<ns2:CancelPenalties>
<ns2:CancelPenalty MaxHoursBeforeCheckIn="24" MinHoursBeforeCheckIn="0" Nights="1" NoShow="false"/>
<ns2:CancelPenalty Nights="1" NoShow="true"/>
</ns2:CancelPenalties>
</ns2:CancelPolicy>


How can I approach this problem. Please just don't mention the library I could use. Try to provide the solution by using that library. Thanks

Answer

You can use the following XPath to find RatePlan based on RatePlanCode attribute value, and then return child element CancelPolicy :

//ns2:RatePlan[@RatePlanCode='49584WPAWAF']/ns2:CancelPolicy

You can execute the XPath using xml.etree, or using lxml* as follow :

from lxml import etree

raw = '''your xml string here'''
root = etree.fromstring(raw)
ns = {'ns2': 'http://www.derbysoft.com/doorway'}
query = "//ns2:RatePlan[@RatePlanCode='49584WPAWAF']/ns2:CancelPolicy"
result = root.xpath(query, namespaces=ns)
print etree.tostring(result[0])