我希望获取下面 xml 的元素名称。
我的请求中的问题是我想获取有效负载元素。为此我使用了这个表达
name(//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>
对于上述请求,我使用相同的表达式,因此它会给出错误,那么我如何在 2 种情况或任何情况下获取 Payload 元素。
我已经尝试过这个但它不起作用
name(//( local-name()='Payload'))
它的给予ERROR - Failed to evaluate XPath expression: A location step was expected following the '/' or '//' token.
因此,请指导获取没有名称空间和不同名称空间的元素,我也尝试过包含表达式,但我无法得到它。
从错误信息可以看出,您编写的语法不正确。如果你想比较每个元素的本地名称,你可以这样做:
//*(local-name() = 'Payload')
但是等等,有更好的选择可以实现这一目标。您在这里所做的基本上是忽略名称空间。您还可以使用通配符命名空间运算符*
用更清晰的语法来实现这一点。这很简单
//*:Payload
如果您仍然想尊重命名空间,您还可以使用 union 运算符合并两个结果|
。这样,您就可以获得带有 env 命名空间且不带任何命名空间的 Payload 元素:
//env:Payload | //Payload
当然,在所有这些情况下您都可以使用name()
获取元素名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)