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