2016-03-29 22 views
0

受注を処理するXML応答を解析しようとしていますが、XPath検索が機能していません。ネームスペース検索で要素が見つかりません

は、ここでXMLレスポンスの抜粋です:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <SalesOrderServiceFindResponse xmlns="http://schemas.microsoft.com/dynamics/2008/01/services"> 
      <SalesOrder xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder"> 
       <DocPurpose>Original</DocPurpose> 
       <SenderId>bell</SenderId> 
       <SalesTable class="entity"> 
        <_DocumentHash>33e9a9be2bcafdb1edde17c4e12d1166</_DocumentHash> 
        <ConsTarget_JP>No</ConsTarget_JP> 
        <CurrencyCode>USD</CurrencyCode> 
        <CustAccount>ANDE01</CustAccount> 
        <CustGroup>Distributo</CustGroup> 
        <CustomsExportOrder_IN>No</CustomsExportOrder_IN> 
        <CustomsShippingBill_IN>No</CustomsShippingBill_IN> 
        <DAXIntegrationId>{5A1B9C05-99DD-4E4E-91F1-2702117CEF98}</DAXIntegrationId> 
        <Deadline>2016-03-31</Deadline> 
        <DeliveryDate>2016-03-01</DeliveryDate> 
        ... 
       </SalesTable> 
       <SalesTable> 
        ... 
       </SalesTable> 
      </SalesOrder> 
     </SalesOrderServiceFindResponse> 
    </s:Body> 
</s:Envelope> 

私はので、私は、外部システムでデータを処理することができて取得しようとしています複数の<SalesTable>エンティティがあります。

ただし、以下では動作しません:

response = client.call(:find, 
     message_tag: :SalesOrderServiceFindRequest, 
     message: { 
      :query_criteria => { 
       :@xmlns => "http://schemas.microsoft.com/dynamics/2006/02/documents/QueryCriteria", 
       :criteria_element => { 
        :data_source_name => "SalesTable", 
        :field_name => "CustGroup", 
        :operator => "Equal", 
        :value1 => "Distributo", 
       } 
      } 
     } 
    ) 

これは空です:

puts response.xpath("//SalesTable") 

これはあまりにも空である:

puts response.xpath("//SalesOrder/SalesTable", "xmlns" => "http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder") # empty 

だからこれです:

puts response.xpath("//SalesOrder", "xmlns" => "http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder") 

SalesTable要素があることを確認できるのでわかりません。見つかるはずですが、機能していません。

答えて

2

クエリには名前空間接頭辞を含める必要があります。あなたはxmlnsそれを使用しているという事実は、それが自動的に適用されますことはありません。

response.xpath("//xmlns:SalesOrder", "xmlns" => "http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder") 

実際には、例えば、異なる接頭辞を使用して価値があるかもしれません

response.xpath("//so:SalesOrder", "so" => "http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder") 
+1

はい、これは正解です。 [Nokogiriチュートリアルの検索](http://www.nokogiri.org/tutorials/searching_a_xml_html_document.html#namespaces)で詳細を読むことができます。 –

+0

問題は、この要素がそのプレフィックスで名前空間になっていないことです。私はMicrosoft Dynamics AIFの応答であるため、システムが返答する内容を制御できません。私はその方法で別の名前空間を追加することはできません。 – Oranges13

+0

動作しません。タグは ''ではなく、 ' 'でないので、それでも一致しません。 – Oranges13

関連する問題