2016-03-29 6 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