SQL中从XML对象指定节点获取xmlns命名空间的实现方法
实现方案
问题成因
你原有的XPath表达式仅定位到最外层的Envelope根节点,没有向下遍历节点树定位到嵌套在Body下的目标Data元素,因此最终返回的是根节点对应的SOAP信封命名空间,而非Data节点自身的命名空间值。
两种适配的查询写法
两种写法都沿用了你原有查询的通配命名空间前缀(*:)逻辑,不需要提前在SQL中通过WITH XMLNAMESPACES声明各节点命名空间,和现有查询风格完全兼容。
- 写法1:全树匹配定位目标节点
遍历整棵XML树匹配第一个本地名称为Data的元素,直接取其命名空间值:
执行后即可得到目标值XMLObject.value('namespace-uri((//*:Data)[1])', 'varchar(200)')http://xmlns.scania.com/management/schema/messages/v3。 - 写法2:层级精准定位(更稳妥高效)
严格按照XML的嵌套结构逐层定位,不做全树遍历,避免误匹配其他位置的同名Data节点,查询效率更高:XMLObject.value('namespace-uri((/*:Envelope/*:Body/*:Data)[1])', 'varchar(200)')
常见踩坑提醒
不要尝试用获取普通节点属性的方式读取命名空间,比如编写Data/@xmlns这类XPath是无法拿到正确值的。SQL XML数据类型的XPath引擎对元素默认命名空间的标准读取方式,就是通过namespace-uri(目标节点)函数实现的。
内容的提问来源于stack exchange,提问作者maverick639
相关产品推荐
相关产品推荐

