如何消除SQL生成的XML中多余的命名空间声明?

时间:2010-01-22 14:28:57

标签: sql-server xml sql-server-2005

我正在调整一个调用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?

感谢。

1 个答案:

答案 0 :(得分:2)

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>