SQL生成XML时内部节点多余xmlns=""属性如何去除?
问题:SQL生成XML时去除节点的空命名空间属性
我正在编写生成XML的SQL代码,原代码如下:
DECLARE @inner xml = '<inner>test</inner>'; WITH XMLNAMESPACES ( DEFAULT 'urn:www.agxml.org:schemas:all:4:0', 'http://www.w3.org/2001/XMLSchema-instance' AS xsi, 'http://www.w3.org/2001/XMLSchema' AS xsd ) SELECT @inner FOR XML PATH('root'), TYPE
执行后生成的XML(已格式化换行)如下:
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:www.agxml.org:schemas:all:4:0" > <inner xmlns="">test</inner> </root>
可以看到xmlns=""属性,尝试去除未成功,请问能否仅在根节点
解决方案
问题根源在于:@inner变量中的<inner>节点属于无命名空间,而根节点通过WITH XMLNAMESPACES指定了默认命名空间urn:www.agxml.org:schemas:all:4:0。SQL Server为了严格保持节点的命名空间归属,会给无命名空间的<inner>节点添加xmlns=""声明,明确它不属于根节点的默认命名空间。
要实现仅根节点带命名空间声明、<inner>节点继承默认命名空间的效果,有两种可行方法:
方法1:直接给@inner中的节点指定对应命名空间
修改@inner的定义,在<inner>节点上直接声明目标命名空间:
DECLARE @inner xml = '<inner xmlns="urn:www.agxml.org:schemas:all:4:0">test</inner>'; WITH XMLNAMESPACES ( DEFAULT 'urn:www.agxml.org:schemas:all:4:0', 'http://www.w3.org/2001/XMLSchema-instance' AS xsi, 'http://www.w3.org/2001/XMLSchema' AS xsd ) SELECT @inner FOR XML PATH('root'), TYPE
方法2:用XML查询迁移节点到目标命名空间
如果@inner是动态生成的,无法预先指定命名空间,可以用XML的query()方法将节点迁移到目标命名空间:
DECLARE @inner xml = '<inner>test</inner>'; -- 将@inner中的节点迁移到目标默认命名空间 SET @inner = @inner.query(' declare default element namespace "urn:www.agxml.org:schemas:all:4:0"; /inner '); WITH XMLNAMESPACES ( DEFAULT 'urn:www.agxml.org:schemas:all:4:0', 'http://www.w3.org/2001/XMLSchema-instance' AS xsi, 'http://www.w3.org/2001/XMLSchema' AS xsd ) SELECT @inner FOR XML PATH('root'), TYPE
执行结果
修改后生成的XML将只有根节点带有命名空间声明,<inner>节点继承默认命名空间,不再出现xmlns="":
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:www.agxml.org:schemas:all:4:0" > <inner>test</inner> </root>
内容的提问来源于stack exchange,提问作者Chunhui Ma
相关产品推荐
相关产品推荐

