2016-03-29 49 views
0

Satış siparişlerini işlemek için XML yanıtını ayrıştırmaya çalışıyorum ancak XPath araması çalışmıyor.Ad alanı arama öğesi bulunamıyor

<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> 

Ben harici bir sistem verileri işleyebilmesi için üstesinden gelmeye çalışıyorum birden <SalesTable> kişiler vardır:

İşte XML yanıtının bir pasajı bu.

Ancak şu çalışmaz:

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", 
       } 
      } 
     } 
    ) 

Bu boş:

puts response.xpath("//SalesTable") 

Bu boş çok:

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

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

Yani bu

Anlamıyorum, çünkü bir SalesTable öğesinin olduğunu doğrulayabiliyorum, bu nedenle bulunmalı, ancak çalışmıyor.

cevap

2

Sorunuza ad alanı önekini eklemeniz gerekir.

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

Aslında, farklı bir öneki kullanılarak değer örneğin olabilir: Eğer xmlns kullanmış olması bunu otomatik olarak uygulanır yapmaz

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

Evet, doğru cevap budur. [Aramada Nokogiri öğreticisi] 'ndan daha fazlasını okuyabilirsiniz (http://www.nokogiri.org/tutorials/searching_a_xml_html_document.html#namespaces). –

+0

Sorun, bu öğenin bu önek ile adlandırılmış olmamasıdır. Bir Microsoft Dynamics AIF yanıtı olduğu için sistemin neyle yanıt verdiğini kontrol edemiyorum. Bu şekilde farklı bir ad alanı ekleyemem. – Oranges13

+0

Çalışmıyor. Etiket ' 'değil, değil, bu yüzden hala eşleşmiyor. – Oranges13