如何使用命名空间和条件构建xpath

时间:2016-02-15 23:41:20

标签: xml xpath

使用此xml:

<?xml version="1.0" encoding="UTF-8"?>
<actionResponse>
   <responses>
       <response>
           <data></data>
           <details>
               <requestId>1</requestId>
           </details>
           <errors>
               <error>
                   <msg>Message 1</msg>
               </error>
               <error>
                   <msg>Message 2</msg>
               </error>
           </errors>
       </response>
       <response>
           <data></data>
           <details>
               <requestId>2</requestId>
           </details>
           <errors>
               <error>
                   <msg>Message 1</msg>
               </error>
               <error>
                   <msg>Message 2</msg>
               </error>
           </errors>
       </response>
   </responses>
</actionResponse>

我可以像这样使用xpath:

  

//回复[details / requestId = 1] / errors / error / msg [text()=&#34;消息1&#34;]    //回复[details / requestId = 2] / errors / error / msg [text()=&#34;消息1&#34;]    //回复[details / requestId = 1] / errors / error / msg [text()=&#34;消息2&#34;]

换句话说,我可以从特定请求中获取消息。当xml具有名称空间时,问题是尝试执行相同的操作。我找不到用这个方法做同样的方法:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
   xmlns:env="http://www.w3.org/2003/05/soap-envelope">
   <env:Body>
       <actionResponse
           xmlns="http://www.sample.com/namespaces/SOAP">
           <responses>
               <response>
                   <data></data>
                   <details>
                       <requestId>1</requestId>
                   </details>
                   <errors>
                       <error>
                           <msg>Message 1</msg>
                       </error>
                       <error>
                           <msg>Message 2</msg>
                       </error>
                   </errors>
               </response>
               <response>
                   <data></data>
                   <details>
                       <requestId>2</requestId>
                   </details>
                   <errors>
                       <error>
                           <msg>Message 1</msg>
                       </error>
                       <error>
                           <msg>Message 2</msg>
                       </error>
                   </errors>
               </response>
           </responses>
       </actionResponse>
   </env:Body>
</env:Envelope>

2 个答案:

答案 0 :(得分:1)

XPath将是:

//soap:response[soap:details/soap:requestId=1]/soap:errors/soap:error/soap:msg[text()="Message 1"]

你必须告诉XPath处理器soap前缀对应http://www.sample.com/namespaces/SOAP

如何执行此操作取决于您使用的处理器。例如,在C#/ .NET中,您将使用XmlNamespaceManager,请参阅this example

答案 1 :(得分:0)

使用xpaths多玩一点,这个解决方案更适合我的情况,谢谢!

//*[local-name()='response']/*[local-name()='details']/*[local-name()='requestId'][text()="1"]/../../*[local-name()='errors']/*[local-name()='error']/*[local-name()='msg'][text()="Message 1"]