sql-server – 如何在SQL生成的XML中消除多余的命名空间声明?

我很好地调整了一个调用SQL存储过程调用支持的SOAP服务的Web应用程序.通常,存储过程生成的
XML成为SOAP响应的一部分,并且XML具有许多多余的xmlns命名空间声明.在病理情况下,这可以是以字节为单位测量的char编码的XML的30%或更多,例如:

<GetFooResponse xmlns="http://service.url/">
    <GetFooResult>
        <FooItems xmlns="http://www.thisisalongishurl.com/schema12345/version12345">
            <Item xmlns="http://www.thisisalongishurl.com/schema12345/version12345" data="foo" />
            <Item xmlns="http://www.thisisalongishurl.com/schema12345/version12345" data="foo" />
            <Item xmlns="http://www.thisisalongishurl.com/schema12345/version12345" data="foo" />
            <Item xmlns="http://www.thisisalongishurl.com/schema12345/version12345" data="foo" />
            <Item xmlns="http://www.thisisalongishurl.com/schema12345/version12345" data="foo" />
        </FooItems >
    </GetFooResult>
</GetFooResponse>

我用来生成XML的SQL通常遵循以下模式:

WITH XMLNAMESPACES(DEFAULT 'http://www.thisisalongishurl.com/schema12345/version12345')
SELECT
    [Name],
    [Value]
FROM
    [Foo]
FOR XML PATH('Item'),
TYPE,
ROOT('FooItems');

有没有办法避免在每个Item XML元素上生成多余的xmlns命名空间declations?

谢谢.

最佳答案

WITH    XMLNAMESPACES(
        'http://www.thisisalongishurl.com/schema12345/version12345' AS short,
        DEFAULT 'http://service.url/'
        ),
        [Foo] ([short:Name], [short:Value]) AS
        (
        SELECT  'testName', 'testValue'
        )
SELECT  *
FROM    [Foo]
FOR XML PATH('Item'),
TYPE,
ROOT('FooItems')

回报

<FooItems xmlns="http://service.url/" xmlns:short="http://www.thisisalongishurl.com/schema12345/version12345">
  <Item>
    <short:Name>testName</short:Name>
    <short:Value>testValue</short:Value>
  </Item>
</FooItems>
点赞