2010-01-22 4 views
4

J'affine une application Web qui appelle les services SOAP sauvegardés par des appels de procédures stockées SQL. Généralement, les procs stockés génèrent du XML qui devient une partie de la réponse SOAP, et ce XML a de nombreuses déclarations d'espace de noms xmlns superflues. Dans les cas pathologiques cela peut être 30% ou plus du XML codé char mesurée en octets, par exemple:Comment éliminer les déclarations d'espace de noms superflues dans le code SQL généré par SQL?

<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> 

SQL que je utilise pour générer du code XML suit généralement ce modèle:

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

Est Y at-il un moyen d'éviter la génération de déclinaisons d'espace de noms xmlns superflues sur chaque élément XML Item?

merci.

Répondre

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') 

retours

<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> 
Questions connexes