我希望获取以下 xml 的元素名称。 我的请求中的问题是我想获取有效负载元素。为此我使用了这个表达式
name(//env:Payload)
所以我得到这个结果env:Payload
<env:requeset xmlns:env="http://eai.ssss.xxx/Envelope" xmlns:ggg="http://fai.dgn.sss/ggg">
<env:clientbody>
<env:Payload>
<ggg:Service>
<ggg:Request>
<a>name</a>
<b>age</b>
<c>address</c>
</ggg:Request>
</ggg:Service>
</env:Payload>
</env:clientbody>
</env:requeset>
但有时我的客户端发送带有不同元素的请求,有时也发送没有命名空间的请求。那么我如何得到以下请求
<requeset xmlns:="http://eai.ssss.xxx/Envelope" xmlns:ggg="http://fai.dgn.sss/ggg">
<clientbody>
<Payload>
<ggg:Service>
<ggg:Request>
<a>name</a>
<b>age</b>
<c>address</c>
</ggg:Request>
</ggg:Service>
</Payload>
</clientbody>
</requeset>
对于上述请求,我使用相同的表达式,因此它会给出错误,那么我如何在两种情况或任何情况下获取 Payload 元素。 我已经尝试过这个但它不起作用
name(//( local-name()='Payload'))
它给出错误 - 无法评估 XPath 表达式:“/”或“//”标记后面应该有一个定位步骤。
因此,请指导如何获取没有 namespace 和不同 namespace 的元素,我也尝试过包含表达式,但我无法得到它。
最佳答案
如错误消息所示,您编写的语法不正确。如果你想比较每个元素的本地名称,你可以这样做:
//*(local-name() = 'Payload')
但是等等,有更好的选择可以实现这一目标。您在这里所做的基本上是忽略 namespace 。您还可以使用通配符命名空间运算符 *
通过更清晰的语法来实现此目的。就这么简单
//*:Payload
如果您仍然想尊重命名空间,您还可以使用联合运算符 |
合并两个结果。这样,您就可以获得带有 env 命名空间且不带任何命名空间的 Payload 元素:
//env:Payload | //Payload
当然,在所有这些情况下,您都可以使用 name()
来获取元素名称。
关于xml - 如何获取具有不同命名空间的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25237925/