什么是正确的XML xpath?

时间:2015-05-12 10:07:18

标签: xml xpath xml-namespaces

这是XML文档。

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mtc="OTC_Matching_11-0" xmlns:rm="OTC_RM_11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="OTC_RM_11-0 /xmls/OTC/OTC_RM_11-0.xsd  OTC_Matching_11-0  /xmls/OTC/OTC_Matching_11-0.xsd                           http://schemas.xmlsoap.org/soap/envelope/ /xmls/OTC/soap-envelope.xsd  ">
<env:Header>
  <OTC_RM xmlns="OTC_RM_11-0">
     <Manifest>
        <TradeMsg>
           <Activity>New</Activity>
           <Status>Submit</Status>
        </TradeMsg>
     </Manifest>
  </OTC_RM>
</env:Header>
</env:Envelope>

活动的xpath不应该是:

/env:Envelope/env:Header/rm:OTC_RM/rm:Manifest/rm:TradeMsg/rm:Activity

我不行。我试了here

问题是什么?

2 个答案:

答案 0 :(得分:2)

您可以选择local-name()函数来解决默认命名空间。试试这个:

/env:Envelope/env:Header/*[local-name()='OTC_RM']/*[local-name()='Manifest']/*[local-name()='TradeMsg']/*[local-name()='Activity']

答案 1 :(得分:1)

当然,由于命名空间在OTC_RM默认,它无法工作。 因此,您必须声明此命名空间及其前缀(例如xmlns:rm="OTC_RM_11-0")OTC_RM及其子级。并且您将能够从以下xpath访问Activity元素:

/env:Envelope/env:Header/rm:OTC_RM/rm:Manifest/rm:TradeMsg/rm:Activity

Try it here

修改 XML应更新,以便在您正在使用的网站上工作,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mtc="OTC_Matching_11-0" xmlns:rm="OTC_RM_11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="OTC_RM_11-0 /xmls/OTC/OTC_RM_11-0.xsd  OTC_Matching_11-0  /xmls/OTC/OTC_Matching_11-0.xsd                           http://schemas.xmlsoap.org/soap/envelope/ /xmls/OTC/soap-envelope.xsd  ">
<env:Header>
    <rm:OTC_RM>
        <rm:Manifest>
            <rm:TradeMsg>
                <rm:Activity>New</rm:Activity>
                <rm:Status>Submit</rm:Status>
            </rm:TradeMsg>
        </rm:Manifest>
    </rm:OTC_RM>
</env:Header>
</env:Envelope>