我很好地调整了一个调用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>