SQL生成XML时如何移除<szamla>标签的xmlns=""属性
解决XML输出中自动添加
xmlns=""的问题 你遇到的问题根源在于:变量@transactionXml里的<szamla>元素没有关联到你指定的默认命名空间http://schemas.nav.gov.hu/2013/szamla,而外层的<szamlak>元素属于这个命名空间,SQL Server为了区分无命名空间的元素,自动给它们加上了xmlns=""属性。要让<szamla>直接继承默认命名空间,有两种实用的处理方式:
方法1:生成@transactionXml时直接绑定命名空间
如果@transactionXml是你自己生成的,在生成阶段就指定默认命名空间,后续合并时就不会出现额外的空命名空间属性。
示例代码:
-- 先生成带正确命名空间的@transactionXml DECLARE @transactionXml XML; WITH XMLNAMESPACES(DEFAULT 'http://schemas.nav.gov.hu/2013/szamla') SELECT @transactionXml = ( -- 这里替换成你生成单个<szamla>元素的实际查询逻辑 SELECT invoice_id AS szamla_azonosito, invoice_date AS szamla_datum FROM your_invoice_table FOR XML PATH('szamla'), TYPE ); -- 执行你原来的外层查询 WITH XMLNAMESPACES(DEFAULT 'http://schemas.nav.gov.hu/2013/szamla', 'http://www.w3.org/2001/XMLSchema' as xs) SELECT CAST(getdate() as date) AS export_datuma, @noOfResults AS export_szla_db, @fromDate AS kezdo_ido, @toDate AS zaro_ido, @minInvoiceNo AS kezdo_szla_szam, @maxInvoiceNo AS zaro_szla_szam, @transactionXml AS [*] FOR XML PATH('szamlak');
方法2:修改已存在的@transactionXml,绑定命名空间
如果@transactionXml是现成的无命名空间XML,你可以通过nodes()和query()方法,把里面的<szamla>元素重新关联到默认命名空间:
示例代码:
DECLARE @transactionXml XML; -- 假设这里已经赋值了无命名空间的<szamla>集合 SET @transactionXml = N'<szamla><szamla_azonosito>123</szamla_azonosito></szamla><szamla><szamla_azonosito>456</szamla_azonosito></szamla>'; -- 重新处理XML,绑定默认命名空间 WITH XMLNAMESPACES(DEFAULT 'http://schemas.nav.gov.hu/2013/szamla') SELECT @transactionXml = ( SELECT szamla.query('.') FROM @transactionXml.nodes('/szamla') AS t(szamla) FOR XML PATH(''), TYPE ); -- 执行原外层查询 WITH XMLNAMESPACES(DEFAULT 'http://schemas.nav.gov.hu/2013/szamla', 'http://www.w3.org/2001/XMLSchema' as xs) SELECT CAST(getdate() as date) AS export_datuma, @noOfResults AS export_szla_db, @fromDate AS kezdo_ido, @toDate AS zaro_ido, @minInvoiceNo AS kezdo_szla_szam, @maxInvoiceNo AS zaro_szla_szam, @transactionXml AS [*] FOR XML PATH('szamlak');
原理补充
XML的命名空间是用来避免元素名称冲突的,当元素没有明确指定命名空间时,SQL Server会默认它属于"无命名空间"范畴。而外层的<szamlak>在你指定的默认命名空间下,为了保证XML结构的正确性,SQL Server会给无命名空间的<szamla>加上xmlns="",明确它不属于外层的默认命名空间。通过让<szamla>也加入默认命名空间,就能让它自动继承外层的命名空间,不再需要额外的空命名空间属性。
内容的提问来源于stack exchange,提问作者dns_nx
相关产品推荐
相关产品推荐

