2010-01-22 3 views
4

Я прекрасно настраиваю веб-приложение, которое вызывает службы SOAP, поддерживаемые вызовами хранимых процедур SQL. Обычно хранимые procs генерируют XML, который становится частью ответа SOAP, и что XML имеет много избыточных объявлений пространства имен xmlns. В патологических случаях это может быть 30% или более полукокса закодированы XML в байтах, например:Как устранить избыточные объявления пространства имен в SQL-выражении XML?

<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, я использую для создания XML, как правило, следует этой схеме:

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

Is есть ли способ избежать генерации избыточных объявлений пространства имен xmlns для каждого элемента XML элемента?

спасибо.

ответ

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> 
Смежные вопросы