使用此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>
答案 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"]