我成功解析了一些XML文件,并处理了涉及的命名空间。 但是我现在从不同的来源获得了一些XML,而且事情不一样!
这是我的XML(简化)
<ConnectionExport xmlns="http://www.sap.com/IS/Connection" version="14.2.4.732">
<Connection>
<technical_name>mytechname</technical_name>
</Connection>
<Connection>
<technical_name>mytechname</technical_name>
</Connection>
</ConnectionExport>
和我解析的代码
SELECT
T.c.query('.')
,T.c.value('(@version)','nvarchar(250)')as [version]
,CN.c.query('.') as [connection]
FROM
@xml.nodes('
declare namespace cnn="http://www.sap.com/IS/Connection";
(cnn:ConnectionExport)
') T(c)
outer apply
T.c.nodes('
Connection
') as CN(c)
前两列按预期返回所有内容,完整的XML文本和[version]值。 但是,CN.c.query(&#39;。&#39;)只是NULL。
我知道它与命名空间有关,因为它可以正常工作,我从XML文件和SQL中删除所有命名空间问题。
谷歌搜索了很多......但仍然在努力去理解错误的概念。答案 0 :(得分:1)
发现它!!
;WITH XMLNAMESPACES ('http://www.sap.com/IS/Connection' AS ns)
SELECT
T.c.query('.')
,T.c.value('(@version)','nvarchar(250)')as [version]
,CN.c.query('.') as [connection]
FROM
@xml.nodes('ns:ConnectionExport') T(c)
outer apply
T.c.nodes('ns:Connection') as CN(c)
答案 1 :(得分:0)
由于命名空间是默认命名空间,您可以使用;WITH XMLNAMESPACES
将命名空间注册为默认来简化查询:
;WITH XMLNAMESPACES (default 'http://www.sap.com/IS/Connection')
SELECT
T.c.query('.')
,T.c.value('(@version)','nvarchar(250)')as [version]
,CN.c.query('.') as [connection]
FROM
@xml.nodes('ConnectionExport') T(c)
outer apply
T.c.nodes('Connection') as CN(c)
这样,除非另有说明,否则xquery中的所有元素都会在默认命名空间中隐式考虑。每次我们想要引用xquery中的元素时都不需要添加相同的前缀。