2016-05-04 18 views
0

xmltodictライブラリを使用してSOAP応答を解析しています。ここでSOAP xmlの応答から詳細を取得します

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Header/> 
<SOAP-ENV:Body> 
    <ns2:MultiAvailabilityResponse xmlns:ns2="http://www.derbysoft.com/doorway" Status="Successful" Token="187be58c62c2f2515b5d78ee"> 
     <ns2:Availabilities> 
      <ns2:Availability CurrencyCode="GBP" HotelCode="HY-LONGE"> 
       <ns2:GuestCount AdultCount="1" ChildCount="0"/> 
       <ns2:RoomTypes> 
        <ns2:RoomType RoomTypeCode="KING" RoomTypeName="Andaz King"> 
         <ns2:RoomTypeDescription>A 29-square-metre room ,Modern furnishings include oversized work desk, plus bathroom with fast-fill tub and heated towel rail.</ns2:RoomTypeDescription> 
        </ns2:RoomType> 
        <ns2:RoomType RoomTypeCode="TWIN" RoomTypeName="Andaz Twin"> 
         <ns2:RoomTypeDescription>A 29-square-metre room ,Modern furnishings include oversized work desk, plus bathroom with fast-fill tub and heated towel rail.</ns2:RoomTypeDescription> 
        </ns2:RoomType> 
        <ns2:RoomType RoomTypeCode="QUEN" RoomTypeName="Andaz Queen"> 
         <ns2:RoomTypeDescription>A 26-square-metre room ,Modern furnishings include oversized work desk, plus bathroom with fast-fill tub and heated towel rail.</ns2:RoomTypeDescription> 
        </ns2:RoomType> 
       </ns2:RoomTypes> 
       <ns2:RatePlans> 
        <ns2:RatePlan RatePlanCode="49584WADPF2" RatePlanName="Advance Purchase"> 
         <ns2:RatePlanDescription>Advance Purchase</ns2:RatePlanDescription> 
        </ns2:RatePlan> 
        <ns2:RatePlan RatePlanCode="49584WADPF" RatePlanName="Advance Purchase"> 
         <ns2:RatePlanDescription>Advance Purchase</ns2:RatePlanDescription> 
        </ns2:RatePlan> 
        <ns2:RatePlan RatePlanCode="49584IPRTF" RatePlanName="Partner Rate"> 
         <ns2:RatePlanDescription>Partner Rate</ns2:RatePlanDescription> 
        </ns2:RatePlan> 
       </ns2:RatePlans> 
       <ns2:RoomRates> 
        <ns2:RoomRate RatePlanCode="49584WADPF2" RoomTypeCode="KING"> 
         <ns2:Rates> 
          <ns2:Rate AmountAfterTax="249.900" AmountBeforeTax="249.900" EffectiveDate="2016-05-05" ExpireDate="2016-05-06"/> 
         </ns2:Rates> 
         <ns2:Fees> 
          <ns2:Fee Amount="0.000" ChargeType="Tax" Type="Exclusive" Unit="PER_ROOM_PER_NIGHT"/> 
         </ns2:Fees> 
        </ns2:RoomRate> 
        <ns2:RoomRate RatePlanCode="49584WADPF2" RoomTypeCode="TWIN"> 
         <ns2:Rates> 
          <ns2:Rate AmountAfterTax="249.900" AmountBeforeTax="249.900" EffectiveDate="2016-05-05" ExpireDate="2016-05-06"/> 
         </ns2:Rates> 
         <ns2:Fees> 
          <ns2:Fee Amount="0.000" ChargeType="Tax" Type="Exclusive" Unit="PER_ROOM_PER_NIGHT"/> 
         </ns2:Fees> 
        </ns2:RoomRate> 
        <ns2:RoomRate RatePlanCode="49584WADPF" RoomTypeCode="QUEN"> 
         <ns2:Rates> 
          <ns2:Rate AmountAfterTax="249.900" AmountBeforeTax="249.900" EffectiveDate="2016-05-05" ExpireDate="2016-05-06"/> 
         </ns2:Rates> 
         <ns2:Fees> 
          <ns2:Fee Amount="0.000" ChargeType="Tax" Type="Exclusive" Unit="PER_ROOM_PER_NIGHT"/> 
         </ns2:Fees> 
        </ns2:RoomRate> 
       </ns2:RoomRates> 
      </ns2:Availability> 
      <ns2:Availability CurrencyCode="USD" HotelCode="HY-CHIRC"> 
       <ns2:GuestCount AdultCount="1" ChildCount="0"/> 
       <ns2:RoomTypes> 
        <ns2:RoomType RoomTypeCode="JRSQ" RoomTypeName="JR SUITE 2 QUEEN BEDS"> 
         <ns2:RoomTypeDescription>Rest in sublime comfort on one of two queen signature Hyatt Grand Beds®, fitted with fine linens, down blanket and plump pillows.</ns2:RoomTypeDescription> 
        </ns2:RoomType> 
        <ns2:RoomType RoomTypeCode="CLBD" RoomTypeName="REG CLUB 2 DOUBLE BEDS"> 
         <ns2:RoomTypeDescription>one King or two double-sized Hyatt Grand Beds, fitted with luxurious linens, a down blanket and plush pillows</ns2:RoomTypeDescription> 
        </ns2:RoomType> 
       </ns2:RoomTypes> 
       <ns2:RatePlans> 
        <ns2:RatePlan RatePlanCode="49584IPRTF" RatePlanName="Partner Rate"> 
         <ns2:RatePlanDescription>Partner Rate</ns2:RatePlanDescription> 
         <ns2:CancelPolicy NonRefundable="true"> 
          <ns2:CancelPenalties/> 
         </ns2:CancelPolicy> 
        </ns2:RatePlan> 
        <ns2:RatePlan RatePlanCode="49584WPAWAF" RatePlanName="Bed and Breakfast"> 
         <ns2:RatePlanDescription>Bed and Breakfast</ns2:RatePlanDescription> 
         <ns2:CancelPolicy NonRefundable="true"> 
          <ns2:CancelPenalties/> 
         </ns2:CancelPolicy> 
        </ns2:RatePlan> 
       </ns2:RatePlans> 
       <ns2:RoomRates> 
        <ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="JRSQ"> 
         <ns2:Rates> 
          <ns2:Rate AmountAfterTax="543.134" AmountBeforeTax="466.650" EffectiveDate="2016-05-05" ExpireDate="2016-05-06"/> 
         </ns2:Rates> 
         <ns2:Fees> 
          <ns2:Fee ChargeType="Tax" Percent="16.390" Type="Exclusive"/> 
         </ns2:Fees> 
        </ns2:RoomRate> 
        <ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="CLBD"> 
         <ns2:Rates> 
          <ns2:Rate AmountAfterTax="370.004" AmountBeforeTax="317.900" EffectiveDate="2016-05-05" ExpireDate="2016-05-06"/> 
         </ns2:Rates> 
         <ns2:Fees> 
          <ns2:Fee ChargeType="Tax" Percent="16.390" Type="Exclusive"/> 
         </ns2:Fees> 
        </ns2:RoomRate> 
        <ns2:RoomRate RatePlanCode="49584IPRTF" RoomTypeCode="VW2Q"> 
         <ns2:Rates> 
          <ns2:Rate AmountAfterTax="325.485" AmountBeforeTax="279.650" EffectiveDate="2016-05-05" ExpireDate="2016-05-06"/> 
         </ns2:Rates> 
         <ns2:Fees> 
          <ns2:Fee ChargeType="Tax" Percent="16.390" Type="Exclusive"/> 
         </ns2:Fees> 
        </ns2:RoomRate> 
       </ns2:RoomRates> 
      </ns2:Availability> 
     </ns2:Availabilities> 
    </ns2:MultiAvailabilityResponse> 
</SOAP-ENV:Body> 

SOAP応答から必要な詳細情報を取得するための私のコードです:

def listify(obj): 
"""To convert each element of SOAP into a list, so processing of response would be easy.""" 
if isinstance(obj, list): 
    return obj 
return [obj] 


def search_hotels_formatted_response(soap): 
    """Parse the response.""" 
    soap = xmltodict.parse(soap, process_namespaces=True) 

    # Deal with namespaces 
    env = 'http://schemas.xmlsoap.org/soap/envelope/:' 
    doorway = 'http://www.derbysoft.com/doorway:' 

    availability = listify(
    soap[env + 'Envelope'] 
     [env + 'Body'] 
     [doorway + 'MultiAvailabilityResponse'] 
     [doorway + 'Availabilities'] 
     [doorway + 'Availability']) 

    # Intermediate data structure to hold room names 
    names = { 
    roomtype['@RoomTypeCode']: roomtype['@RoomTypeName'] 
    for _availability in availability 
    for roomtype in listify(_availability 
          [doorway + 'RoomTypes'] 
          [doorway + 'RoomType']) 
} 

    return_dict = { 
    'ibp': 'dbs', 
    'rL': sorted([ 
     { 
      'rtc': roomrate['@RoomTypeCode'], 
      'rpc': roomrate['@RatePlanCode'], 
      'rtn': names[roomrate['@RoomTypeCode']], 
      'rmt': rate['@AmountBeforeTax'], 
      'cur': _availability['@CurrencyCode'], 
      'ttc': float(rate['@AmountAfterTax']) - float(rate['@AmountBeforeTax']), 
      'egc': 0, 
      'long': '' 

     } 
     for _availability in availability 
     for roomrate in listify(_availability 
           [doorway + 'RoomRates'] 
           [doorway + 'RoomRate']) 
     for rate in listify(roomrate 
          [doorway + 'Rates'] 
          [doorway + 'Rate'])], 
     key=lambda x: float(x['rmt'])), 
    'hc': _availability['@HotelCode'], 
    'hn': '' 
} 

    return return_dict 

私は辞書の必要な形式にSOAPメッセージから必要な詳細情報を取得することができています。しかし、私は上で共有されたこの特定のSOAPメッセージから詳細を取得する際に問題を抱えています。他のすべてのケースでは、私はちょうどそれの組み合わせの異なる数を持つ単一のホテルの応答を得ていたが、このSOAP応答で私は2つのホテルがあり、私の解析コードは、両方のホテルの部屋の価格を同時に取得しているそれをソートします。しかし、私はセコングホテルのオプションで最初のホテルのオプションでソートをしたい。ホテルの数は様々である可能性があるので、ホテルの数に関係なく機能する一般的なソリューションを提供してください。

すべてのヘルプが評価されます。ありがとう!

+0

は、あなたもその中に助けることができます:) –

+0

所望の出力、リストの具体的な構造は何ですか? JSON形式のようですか? – Parfait

答えて

1

XSLT、XML文書を変換するために特に使用宣言型プログラミング言語を使用してXMLを簡素化することを検討してください。 Pythonはlxmlモジュールを使用してXSLT 1.0を実行できます。そこから、変換された木をxmltodictという辞書に構文解析し、さらにjsonに構文解析することができます。以下の3つの出力はすべて以下に含まれます。

XSLTスクリプト(以下の.xslファイルとして保存されます)。PYスクリプト)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:ns2="http://www.derbysoft.com/doorway"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <!-- Response Level --> 
    <xsl:template match="ns2:MultiAvailabilityResponse"> 
    <Responses>  
     <xsl:apply-templates select="ns2:Availabilities"/> 
    </Responses> 
    </xsl:template> 

    <xsl:template match="ns2:Availabilities"> 
    <xsl:apply-templates select="ns2:Availability"> 
     <xsl:sort select="@CurrencyCode" order="descending"/> 
    </xsl:apply-templates>  
    </xsl:template> 

    <!-- Hotel Level --> 
    <xsl:template match="ns2:Availability">  
    <Hotel>  
     <xsl:apply-templates select="ns2:RoomRates"/> 
    </Hotel> 
    </xsl:template> 

    <!-- Room Rates Level --> 
    <xsl:template match="ns2:RoomRates">   
    <xsl:apply-templates select="ns2:RoomRate">   
     <xsl:sort select="descendant::ns2:Rate/@AmountBeforeTax" 
       order="ascending" data-type="number"/> 
    </xsl:apply-templates>  
    </xsl:template> 

    <!-- Room Rate Level --> 
    <xsl:template match="ns2:RoomRate"> 
    <RoomRate>  
     <ibp>dbs</ibp> 
     <rL><xsl:apply-templates select="ns2:Rates"/></rL> 
     <hc><xsl:value-of select="ancestor::ns2:Availability/@HotelCode"/></hc> 
     <hn></hn> 
    </RoomRate> 
    </xsl:template> 

    <!-- Rates Level --> 
    <xsl:template match="ns2:Rates/*">  
    <xsl:variable name="rtc" select="ancestor::ns2:RoomRate/@RoomTypeCode"/> 
    <rtc><xsl:value-of select="$rtc"/></rtc> 
    <rpc><xsl:value-of select="ancestor::ns2:RoomRate/@RatePlanCode"/></rpc> 
    <rtn><xsl:value-of select="ancestor::ns2:Availability/ns2:RoomTypes/ 
           ns2:RoomType[@RoomTypeCode=$rtc]/@RoomTypeName"/></rtn> 
    <rmt><xsl:value-of select="@AmountBeforeTax"/></rmt> 
    <cur><xsl:value-of select="ancestor::ns2:Availability/@CurrencyCode"/></cur> 
    <ttc><xsl:value-of select="@AmountAfterTax - @AmountBeforeTax"/></ttc> 
    <egc>0</egc> 
    <long></long> 
    </xsl:template> 

</xsl:transform> 

のPythonスクリプト(XML、辞書、およびJSONタイプに出力)

import lxml.etree as ET 
import xmltodict 
import json 

# LOAD XML AND XSL 
dom = ET.parse('soap.xml') 
xslt = ET.parse('XSLTScript.xsl') 

# TRANSFORM 
transform = ET.XSLT(xslt) 
newdom = transform(dom) 

# NEW TREE OUTPUT 
return_xml = ET.tostring(newdom, encoding='UTF-8', pretty_print=True, xml_declaration=True) 
print(return_xml.decode("utf-8")) 

return_dict = xmltodict.parse(return_xml) 
print(return_dict) 

return_json = json.dumps(return_dict, indent=4) 
print(return_json) 

変換されたXML出力

<?xml version='1.0' encoding='UTF-8'?> 
<Responses xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://www.derbysoft.com/doorway"> 
    <Hotel> 
    <RoomRate> 
     <ibp>dbs</ibp> 
     <rL> 
     <rtc>VW2Q</rtc> 
     <rpc>49584IPRTF</rpc> 
     <rtn/> 
     <rmt>279.650</rmt> 
     <cur>USD</cur> 
     <ttc>45.835</ttc> 
     <egc>0</egc> 
     <long/> 
     </rL> 
     <hc>HY-CHIRC</hc> 
     <hn/> 
    </RoomRate> 
    <RoomRate> 
     <ibp>dbs</ibp> 
     <rL> 
     <rtc>CLBD</rtc> 
     <rpc>49584IPRTF</rpc> 
     <rtn>REG CLUB 2 DOUBLE BEDS</rtn> 
     <rmt>317.900</rmt> 
     <cur>USD</cur> 
     <ttc>52.104</ttc> 
     <egc>0</egc> 
     <long/> 
     </rL> 
     <hc>HY-CHIRC</hc> 
     <hn/> 
    </RoomRate> 
    <RoomRate> 
     <ibp>dbs</ibp> 
     <rL> 
     <rtc>JRSQ</rtc> 
     <rpc>49584IPRTF</rpc> 
     <rtn>JR SUITE 2 QUEEN BEDS</rtn> 
     <rmt>466.650</rmt> 
     <cur>USD</cur> 
     <ttc>76.484</ttc> 
     <egc>0</egc> 
     <long/> 
     </rL> 
     <hc>HY-CHIRC</hc> 
     <hn/> 
    </RoomRate> 
    </Hotel> 
    <Hotel> 
    <RoomRate> 
     <ibp>dbs</ibp> 
     <rL> 
     <rtc>KING</rtc> 
     <rpc>49584WADPF2</rpc> 
     <rtn>Andaz King</rtn> 
     <rmt>249.900</rmt> 
     <cur>GBP</cur> 
     <ttc>0</ttc> 
     <egc>0</egc> 
     <long/> 
     </rL> 
     <hc>HY-LONGE</hc> 
     <hn/> 
    </RoomRate> 
    <RoomRate> 
     <ibp>dbs</ibp> 
     <rL> 
     <rtc>TWIN</rtc> 
     <rpc>49584WADPF2</rpc> 
     <rtn>Andaz Twin</rtn> 
     <rmt>249.900</rmt> 
     <cur>GBP</cur> 
     <ttc>0</ttc> 
     <egc>0</egc> 
     <long/> 
     </rL> 
     <hc>HY-LONGE</hc> 
     <hn/> 
    </RoomRate> 
    <RoomRate> 
     <ibp>dbs</ibp> 
     <rL> 
     <rtc>QUEEN</rtc> 
     <rpc>49584WADPF</rpc> 
     <rtn>Andaz Queen</rtn> 
     <rmt>249.900</rmt> 
     <cur>GBP</cur> 
     <ttc>0</ttc> 
     <egc>0</egc> 
     <long/> 
     </rL> 
     <hc>HY-LONGE</hc> 
     <hn/> 
    </RoomRate> 
    </Hotel> 
</Responses> 

Pythonの辞書

OrderedDict([('Responses', OrderedDict([('@xmlns:SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/'), 
('@xmlns:ns2', 'http://www.derbysoft.com/doorway'), ('Hotel', [OrderedDict([('RoomRate', [OrderedDict([('ibp', 'dbs'), 
('rL', OrderedDict([('rtc', 'VW2Q'), ('rpc', '49584IPRTF'), ('rtn', None), ('rmt', '279.650'), ('cur', 'USD'), 
('ttc', '45.835'), ('egc', '0'), ('long', None)])), ('hc', 'HY-CHIRC'), ('hn', None)]), OrderedDict([('ibp', 'dbs'), 
('rL', OrderedDict([('rtc', 'CLBD'), ('rpc', '49584IPRTF'), ('rtn', 'REG CLUB 2 DOUBLE BEDS'), ('rmt', '317.900'), 
('cur', 'USD'), ('ttc', '52.104'), ('egc', '0'), ('long', None)])), ('hc', 'HY-CHIRC'), ('hn', None)]), 
OrderedDict([('ibp', 'dbs'), ('rL', OrderedDict([('rtc', 'JRSQ'), ('rpc', '49584IPRTF'), ('rtn', 'JR SUITE 2 QUEEN BEDS'), 
('rmt', '466.650'), ('cur', 'USD'), ('ttc', '76.484'), ('egc', '0'), ('long', None)])), ('hc', 'HY-CHIRC'), 
('hn', None)])])]), OrderedDict([('RoomRate', [OrderedDict([('ibp', 'dbs'), ('rL', OrderedDict([('rtc', 'KING'), 
('rpc', '49584WADPF2'), ('rtn', 'Andaz King'), ('rmt', '249.900'), ('cur', 'GBP'), ('ttc', '0'), ('egc', '0'), 
('long', None)])), ('hc', 'HY-LONGE'), ('hn', None)]), OrderedDict([('ibp', 'dbs'), ('rL', OrderedDict([('rtc', 'TWIN'), 
('rpc', '49584WADPF2'), ('rtn', 'Andaz Twin'), ('rmt', '249.900'), ('cur', 'GBP'), ('ttc', '0'), ('egc', '0'), 
('long', None)])), ('hc', 'HY-LONGE'), ('hn', None)]), OrderedDict([('ibp', 'dbs'), ('rL', OrderedDict([('rtc', 'QUEEN'), 
('rpc', '49584WADPF'), ('rtn', 'Andaz Queen'), ('rmt', '249.900'), ('cur', 'GBP'), ('ttc', '0'), ('egc', '0'), 
('long', None)])), ('hc', 'HY-LONGE'), ('hn', None)])])])])]))]) 

JSON出力Robᵩ@

{ 
    "Responses": { 
      "@xmlns:SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/", 
      "@xmlns:ns2": "http://www.derbysoft.com/doorway", 
      "Hotel": [ 
       { 
        "RoomRate": [ 
         { 
           "ibp": "dbs", 
           "rL": { 
            "rtc": "VW2Q", 
            "rpc": "49584IPRTF", 
            "rtn": null, 
            "rmt": "279.650", 
            "cur": "USD", 
            "ttc": "45.835", 
            "egc": "0", 
            "long": null 
           }, 
           "hc": "HY-CHIRC", 
           "hn": null 
         }, 
         { 
           "ibp": "dbs", 
           "rL": { 
            "rtc": "CLBD", 
            "rpc": "49584IPRTF", 
            "rtn": "REG CLUB 2 DOUBLE BEDS", 
            "rmt": "317.900", 
            "cur": "USD", 
            "ttc": "52.104", 
            "egc": "0", 
            "long": null 
           }, 
           "hc": "HY-CHIRC", 
           "hn": null 
         }, 
         { 
           "ibp": "dbs", 
           "rL": { 
            "rtc": "JRSQ", 
            "rpc": "49584IPRTF", 
            "rtn": "JR SUITE 2 QUEEN BEDS", 
            "rmt": "466.650", 
            "cur": "USD", 
            "ttc": "76.484", 
            "egc": "0", 
            "long": null 
           }, 
           "hc": "HY-CHIRC", 
           "hn": null 
         } 
        ] 
       }, 
       { 
        "RoomRate": [ 
         { 
           "ibp": "dbs", 
           "rL": { 
            "rtc": "KING", 
            "rpc": "49584WADPF2", 
            "rtn": "Andaz King", 
            "rmt": "249.900", 
            "cur": "GBP", 
            "ttc": "0", 
            "egc": "0", 
            "long": null 
           }, 
           "hc": "HY-LONGE", 
           "hn": null 
         }, 
         { 
           "ibp": "dbs", 
           "rL": { 
            "rtc": "TWIN", 
            "rpc": "49584WADPF2", 
            "rtn": "Andaz Twin", 
            "rmt": "249.900", 
            "cur": "GBP", 
            "ttc": "0", 
            "egc": "0", 
            "long": null 
           }, 
           "hc": "HY-LONGE", 
           "hn": null 
         }, 
         { 
           "ibp": "dbs", 
           "rL": { 
            "rtc": "QUEEN", 
            "rpc": "49584WADPF", 
            "rtn": "Andaz Queen", 
            "rmt": "249.900", 
            "cur": "GBP", 
            "ttc": "0", 
            "egc": "0", 
            "long": null 
           }, 
           "hc": "HY-LONGE", 
           "hn": null 
         } 
        ] 
       } 
      ] 
    } 
} 
+0

私は部屋が特定のホテルの料金に基づいてソートされて欲しいが、答えに感謝します。だから私は2つのホテルがある場合、最初のホテルのすべての異なるオプションは、USDの価格を持っている価格に基づいてソートされる必要があり、2番目のホテルのオプションは、GBP ..で価格を持っているseparatelをソートする必要があります。私のコードによれば、すべてのホテルのすべての部屋を一度にソートしています... –

+0

XSLTは確かに ''を使って要素/属性値でドキュメントをソートできます。ホテル内でソートされた通貨での編集と各ホテル内でソートされた客室料金を参照してください。 – Parfait

+0

お時間をいただきありがとうございます。これは私が探していた答えです。私はちょうど1つの質問があります:入力に応じて様々なSOAP応答を取得しています。それでは、どうすればxslファイルを作成できますか?私はそれをハードコードすることはできません..私は直接xmltodictを使用できませんか? –

0

すべての客室料金の結果からリストの理解を作成していますが、ホテルコードはリストと同じレベルのループの外にあります。 それで、あなたはいつもホテルの1つだけを得るでしょう。コードで

'hc': _availability['@HotelCode'], 

変数_availabilityは "可用性に_availabilityための" 前のループの最後の出現です。ループはブロックのために「普通」でした、それはそこで定義されることさえありませんでした。

私の意見では、このような複雑なデータ構造は読み込みと使用が非常に難しく、オブジェクトの属性のデータでOOPアプローチを検討する必要があります。

あなたは、このようなデータ構造を使用して主張する場合、あなたはこのようにそれを行うことができます。

def search_hotels_formatted_response(soap): 
    """Parse the response.""" 
    soap = xmltodict.parse(soap, process_namespaces=True) 

    # Deal with namespaces 
    env = 'http://schemas.xmlsoap.org/soap/envelope/:' 
    doorway = 'http://www.derbysoft.com/doorway:' 

    availability = listify(
    soap[env + 'Envelope'] 
     [env + 'Body'] 
     [doorway + 'MultiAvailabilityResponse'] 
     [doorway + 'Availabilities'] 
     [doorway + 'Availability']) 

    # Intermediate data structure to hold room names 
    names = { 
    roomtype['@RoomTypeCode']: roomtype['@RoomTypeName'] 
    for _availability in availability 
    for roomtype in listify(_availability 
          [doorway + 'RoomTypes'] 
          [doorway + 'RoomType']) 
} 

    # Intermediate data structure to hold rates 
    rates = { 
    rate['@RoomTypeCode']: rate 
    for _availability in availability 
    for rate in listify(_availability 
          [doorway + 'RoomRates'] 
          [doorway + 'RoomRate']) 
} 

    return_list = [] 
    for _availability in availability: 
     return_list.append({ 
    'ibp': 'dbs', 
    'rL': sorted([ 
     { 
      'rtc': rates[roomtype['@RoomTypeCode']]['@RoomTypeCode'], 
      'rpc': rates[roomtype['@RoomTypeCode']]['@RatePlanCode'], 
      'rtn': names[rates[roomtype['@RoomTypeCode']]['@RoomTypeCode']], 
      'rmt': rates[roomtype['@RoomTypeCode']][doorway + 'Rates'][doorway + 'Rate']['@AmountBeforeTax'], 
      'cur': _availability['@CurrencyCode'], 
      'ttc': float(rates[roomtype['@RoomTypeCode']][doorway + 'Rates'][doorway + 'Rate']['@AmountAfterTax']) - float(rates[roomtype['@RoomTypeCode']][doorway + 'Rates'][doorway + 'Rate']['@AmountBeforeTax']), 
      'egc': 0, 
      'long': '', 
     } 
     for roomtype in listify(_availability 
          [doorway + 'RoomTypes'] 
          [doorway + 'RoomType'])], 
     key=lambda x: float(x['rmt'])), 
    'hc': _availability['@HotelCode'], 
    'hn': '' 
}) 

    return return_list 
+0

あなたからの説明が正しくありません。私はすべてのホテルから結果を得て、それを並べ替えることができます。しかし、私の問題は次のとおりです。最初のホテルの料金を別々に、次に2番目に並べ替えるなどしたいと思います。現在、すべてのホテルのすべての結果をまとめて並べ替えています。 –

+0

はい、ホテルを回覧したい場合は、何らかのループを作成する必要がありますが、そうしないといけません。その代わりに、あなたはすべてのレートをループし、ループが終了した後、データに1つのホテルを追加します。前のループの最後のホテルです。さらに、複雑なデータ構造では、別のホテルを保管することさえできません.1つの料金表と1つのホテルを含む1つのホテルがあります。あなたはここで一つの外側のループを欠いている、これは私が言うことを試みているものです。 – Jura

+0

作業コードを回答に掲載しました。 – Jura

関連する問題