Ruby 命名空间搜索未找到元素

Ruby 命名空间搜索未找到元素,ruby,xpath,nokogiri,microsoft-dynamics,savon,Ruby,Xpath,Nokogiri,Microsoft Dynamics,Savon,我试图解析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">

我试图解析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>
这是空的:

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
元素,因此应该找到它,但它不起作用。

您需要在查询中包含名称空间前缀。您使用它的事实并不意味着它会自动应用:

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

您需要在查询中包含名称空间前缀。您使用它的事实并不意味着它会自动应用:

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

是的,这是正确的答案。您可以在上阅读更多内容。问题是此元素没有使用该前缀命名。我无法控制系统回复的内容,因为它是Microsoft Dynamics AIF响应。我无法让它以这种方式添加其他名称空间。它不起作用。标记是
而不是
,因此它仍然不匹配。@橙色13无论原始XML中使用的前缀是什么,重要的是查询中的命名空间与文档中的命名空间匹配。在文档中,元素位于
http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder
名称空间(因为它是
SalesOrder
元素的后代,该元素具有
xmlns
属性集)。您需要确保在查询中指定相同的名称空间,并通过使用前缀(任何前缀,都无所谓)并将该前缀与名称空间关联来实现。是的,这是正确的答案。您可以在上阅读更多内容。问题是此元素没有使用该前缀命名。我无法控制系统回复的内容,因为它是Microsoft Dynamics AIF响应。我无法让它以这种方式添加其他名称空间。它不起作用。标记是
而不是
,因此它仍然不匹配。@橙色13无论原始XML中使用的前缀是什么,重要的是查询中的命名空间与文档中的命名空间匹配。在文档中,元素位于
http://schemas.microsoft.com/dynamics/2008/01/documents/SalesOrder
名称空间(因为它是
SalesOrder
元素的后代,该元素具有
xmlns
属性集)。您需要确保在查询中指定相同的名称空间,并通过使用前缀(任何前缀,都无所谓)并将该前缀与名称空间关联来实现这一点。