Coldfusion 9 を使用して SOAP Web サービスを作成し、販売パートナーが注文を e コマース プラットフォームに直接投稿できるようにしています。インバウンド SOAP メッセージには、次のようなノードが含まれています。
...
<LineItem xsi:type="ws1:Item">
<LineNumber xsi:type="xsd:double">1</LineNumber>
<PartNumber xsi:type="xsd:string">Widget-01</PartNumber>
<Price xsi:type="xsd:double">100</Price>
<Quantity xsi:type="xsd:double">4</Quantity>
<SubscriberEmail xsi:type="xsd:string">nitwit@gmail.com</SubscriberEmail>
<UnitofMeasure xsi:type="xsd:string">EA</UnitofMeasure>
</LineItem>
...
次の Coldfusion コードを含むインバウンド リクエストを受信しています。
<cfset theXML = getsoaprequest() />
<cfset arrNodes = XmlSearch(theXML, "//LineItem") />
<cfset rtn = arrNodes[1].PartNumber.XmlText/>
しかし、3 行目で次のエラーがスローされます。
3 行目を次のように変更すると、arrNodes[1].XmlChildren
結果は返されません。子ノードが存在しないように見えarrNodes[1]
ますが、完全に設定されたノードが返されます。
私は何が欠けていますか?
編集: SoapBody 全体は次のとおりです。
<soapenv:Body>
<ws1:createOrder soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Order xsi:type="ws1:Order">
<BillToAddress xsi:type="ws1:Address">
<AddrLine1 xsi:type="xsd:string">10101 Main Street</AddrLine1>
<AddrLine2 xsi:type="xsd:string">Science Lab</AddrLine2>
<AddrLine3 xsi:type="xsd:string"></AddrLine3>
<Attention xsi:type="xsd:string">John Doe</Attention>
<AttnPhone xsi:type="xsd:string">877-555-0131</AttnPhone>
<City xsi:type="xsd:string">Roseville</City>
<CompanyName xsi:type="xsd:string">Washington High School</CompanyName>
<Country xsi:type="xsd:string">USA</Country>
<PostalCode xsi:type="xsd:string">95747</PostalCode>
<StateProvince xsi:type="xsd:string">CA</StateProvince>
</BillToAddress>
<CustPO xsi:type="xsd:string">asdfasdf13241234</CustPO>
<OrderDate xsi:type="xsd:dateTime">2002-05-30T09:00:00</OrderDate>
<OrderDetail xsi:type="ws1:Orderdetail">
<LineItem xsi:type="ws1:Item">
<LineNumber xsi:type="xsd:double">1</LineNumber>
<PartNumber xsi:type="xsd:string">Widget01</PartNumber>
<Price xsi:type="xsd:double">100</Price>
<Quantity xsi:type="xsd:double">4</Quantity>
<SubscriberEmail xsi:type="xsd:string">nitwit@gmail.com</SubscriberEmail>
<UnitofMeasure xsi:type="xsd:string">EA</UnitofMeasure>
</LineItem>
<LineItem xsi:type="ws1:Item">
<LineNumber xsi:type="xsd:double">2</LineNumber>
<PartNumber xsi:type="xsd:string">>Widget02</PartNumber>
<Price xsi:type="xsd:double">100</Price>
<Quantity xsi:type="xsd:double">6</Quantity>
<SubscriberEmail xsi:type="xsd:string">nitwit@gmail.com</SubscriberEmail>
<UnitofMeasure xsi:type="xsd:string">EA</UnitofMeasure>
</LineItem>
</OrderDetail>
<PurchAgent xsi:type="xsd:string">Mary</PurchAgent>
<PurchAgentEmail xsi:type="xsd:string">mary@gmail.com</PurchAgentEmail>
<PurchAgentPhone xsi:type="xsd:string">877-555-0131</PurchAgentPhone>
<ShipToAddress xsi:type="ws1:Address">
<AddrLine1 xsi:type="xsd:string">10101 Main Street</AddrLine1>
<AddrLine2 xsi:type="xsd:string">Science Lab</AddrLine2>
<AddrLine3 xsi:type="xsd:string"></AddrLine3>
<Attention xsi:type="xsd:string">John Doe</Attention>
<AttnPhone xsi:type="xsd:string">877-555-0131</AttnPhone>
<City xsi:type="xsd:string">Roseville</City>
<CompanyName xsi:type="xsd:string">Washington High School</CompanyName>
<Country xsi:type="xsd:string">USA</Country>
<PostalCode xsi:type="xsd:string">95747</PostalCode>
<StateProvince xsi:type="xsd:string">CA</StateProvince>
</ShipToAddress>
<SoldToAddress xsi:type="ws1:Address">
<AddrLine1 xsi:type="xsd:string">10101 Main Street</AddrLine1>
<AddrLine2 xsi:type="xsd:string">Science Lab</AddrLine2>
<AddrLine3 xsi:type="xsd:string"></AddrLine3>
<Attention xsi:type="xsd:string">John Doe</Attention>
<AttnPhone xsi:type="xsd:string">877-555-0131</AttnPhone>
<City xsi:type="xsd:string">Roseville</City>
<CompanyName xsi:type="xsd:string">Washington High School</CompanyName>
<Country xsi:type="xsd:string">USA</Country>
<PostalCode xsi:type="xsd:string">95747</PostalCode>
<StateProvince xsi:type="xsd:string">CA</StateProvince>
</SoldToAddress>
</Order>
</ws1:createOrder>
編集:これを機能させるために(スコットの提案で)追加したコードは次のとおりです。
<cfset strXML = ToString(docXML) />
<cfset strXml = REReplace( strXml, "^[^<]*", "", "all" ) />
<cfset docXML = XMLParse(strXML) />