从XML命名空间
问题描述:
选择数据我是新手,SQL和XML。我的目标是从客户块内的所有元素,但在SELECT没有返回任何数据获取数据。没有命名空间查询的作品。从XML命名空间
你能帮忙吗?
DECLARE @x XML='<BusinessEvent Name="FO.Client">
<ClientMessage xmlns="http://www.fwbs.net/Aderant.BO.Integration/FO.MessageTypes.xsd">
<OriginatingProcessIdentity></OriginatingProcessIdentity>
<Operation></Operation>
<IsDataIncluded></IsDataIncluded>
<Clients>
<Client>
<GlobalId></GlobalId>
<ClID>g</ClID>
<No></No>
<Type></Type>
<Name></Name>
<BrCode></BrCode>
<Created></Created>
<FeeUsrID></FeeUsrID>
<DefaultAddID></DefaultAddID>
<ContID></ContID>
</Client>
</Clients>
</ClientMessage>
</BusinessEvent>'
;WITH XMLNAMESPACES
(DEFAULT 'http://www.fwbs.net/Aderant.BO.Integration/FO.MessageTypes.xsd')
SELECT TOP 10 cl.c.value('(text())[1]', 'varchar(20)') clid
FROM (SELECT @x data) data
CROSS APPLY [data].nodes('/BusinessEvent/ClientMessage/Clients/Client/ClID') AS cl(c)
答
由于命名空间是不的根元素,因而不会不适用于整个 XML文档,你不能把它定义为您的T-SQL代码中的“默认”的命名空间 - 你必须是具体的:
;WITH XMLNAMESPACES ('http://www.fwbs.net/Aderant.BO.Integration/FO.MessageTypes.xsd' AS ns)
SELECT TOP 10
cl.c.value('(text())[1]', 'varchar(20)') clid
FROM
@x.nodes('/BusinessEvent/ns:ClientMessage/ns:Clients/ns:Client/ns:ClID') AS cl(c)
的<BusinessEvent>
元素是是XML命名空间的不部分 - 但如果你将其定义为在DEFAULT
命名空间的T-SQL语句,在您的XPath定义的默认命名空间将被应用到你的XML元素的所有 - 这样的<BusinessEvent>
顶级节点是不匹配....
+0
与命名空间相得益彰,从我身边+1。我认为,'XPath'不应该放在'ns:ClID'上,而应该在'ns:Client'后面停止,以便一次性处理内部元素(请参阅我对OP的评论)。 – Shnugo
答案@marc_s给你帮助你使用命名空间(虽然你使用'DEFAULT'的解决方案是可以的,但如果你只改变了....节点('/ *:BusinessEvent ...')来通配最外层节点的名字空间。一个提示:如您想获得*从客户端块*内的所有元素的数据,你应该停止'XPath'在'.nodes()'客户端后,读取与'c.value(“CLID [每个元素1]”, '为nvarchar(最大)')'。这允许你使用相同的'CROSS APPLY'来处理所有的内部元素。 – Shnugo