从带命名空间的XML中选择数据

时间:2016-12-01 11:47:02

标签: sql-server xml

我是SQL和XML的新手。我的目标是从客户端块中获取所有元素的数据,但SELECT不返回任何数据。没有命名空间,查询就可以工作。

你能帮忙吗?

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)

1 个答案:

答案 0 :(得分:3)

由于根元素上的命名空间,因此应用于整个 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命名空间的一部分 - 但如果您在T-SQL语句中将其定义为DEFAULT命名空间,则该默认命名空间将为应用于XPath中定义的所有 XML元素 - 因此<BusinessEvent>顶级节点 NOT 匹配....