xml - 如何获取具有不同命名空间的元素

标签 xml xpath xquery

我希望获取以下 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/

相关文章:

java - JAXB 如何读取此 XML 文件?

java - 将 XML 字符串拆分为属性

python-3.x - 如何在 Python 中从 html 中抓取无序列表?

xpath - 在Xquery中使用fn:string-length时出错

xml - XSLT:读取作为字符串传递的 xml 文档的参数

python - 如何将网站的多个部分中的多个属性映射为 scrapy 项目?

python - 在 python 中使用字符串会产生奇怪的引号

java - 当我使用 xs :long? 添加数值条件时,为什么此 XQuery 会失败

sql-server - 当不支持 "following"轴时,在 XPath 中获取以下同级

xml - 如何从 SQL Server 2005 中获取 XML 数据并将其作为节点插入到 TXMLDocument 中?