2010-02-26 2 views
1

Мы сталкиваемся с необычной проблемой с SQL Server 2005/2008 с использованием FOR XML с фрагментами xml и namespaces. Вот вопрос, о котором идет речь.Как подавить пустые пространства имен с FOR XML на сервере Sql

WITH XMLNAMESPACES ( 
DEFAULT 'http://tempuri.org/newincomingxml.xsd', 
'http://tempuri.org/newincomingxml.xsd' as [xsi], 
'http://tempuri.org/newincomingxml.xsd' as [a] 
) 
SELECT 
[@a:Source], [AddressCount], [ConsumerCount], [EmailCount], [PermissionCount] 
, (
    SELECT 
    [Consumer] 
    FROM tbcExportBRC_Current xmlmaster 
    FOR XML PATH(''), ROOT('Consumers'), TYPE 
) 
FROM tbcExportBRCBatch_Current xmlroot 
FOR XML PATH('Datafeed'), TYPE 

[Клиент] поле представляет собой фрагмент XML. Когда я запускаю это, я получаю.

<Datafeed xmlns:a="http://tempuri.org/newincomingxml.xsd" xmlns:xsi="http://tempuri.org/newincomingxml.xsd" xmlns="http://tempuri.org/newincomingxml.xsd" a:Source="DSD"> 
    <AddressCount>0</AddressCount> 
    <ConsumerCount>0</ConsumerCount> 
    <EmailCount>0</EmailCount> 
    <PermissionCount>0</PermissionCount> 
    <Consumers xmlns:a="http://tempuri.org/newincomingxml.xsd" xmlns:xsi="http://tempuri.org/newincomingxml.xsd" xmlns="http://tempuri.org/newincomingxml.xsd"> 
    <Consumer> 
     <ConsumerType xmlns="">Individual</ConsumerType> 
     <FirstName xmlns="">STEVE</FirstName> 
     <LastName xmlns="">SMITH</LastName> 
    </Consumer> 
    </Consumers> 
</Datafeed> 

Если вы заметили, дети в теге имеют Xmlns = "" в них. Если мы посмотрим на фрагмент непосредственно в таблице, это будет выглядеть так.

 <ConsumerType>Individual</ConsumerType> 
     <FirstName>STEVE</FirstName> 
     <LastName>SMITH</LastName> 

можно удалить пространство имен по умолчанию

DEFAULT 'http://tempuri.org/newincomingxml.xsd', 

Он удаляет Xmlns = «», но мы должны иметь в файле. Есть идеи?

ответ

3

Результат правильный. В таблице у вас есть элементы без пространства имен, поэтому, когда вы добавляете их под элементом «Потребители» с пространством имен по умолчанию xmlns = «http://tempuri.org/newincomingxml.xsd», элементы из таблицы должны замените пространство имен по умолчанию на «».

Это именно то, что вы должны увидеть. Не имея xmlns = "" означает, что элементы ConsumerType/FirstName/LastName находятся в пространстве имен "http://tempuri.org/newincomingxml.xsd", что является ложным.

Возможно, что вы, вероятно, хотите переместить элементы ConsumerType/FirstName/LastName в пространство имен «http://tempuri.org/newincomingxml.xsd», чтобы соответствовать пространству имен родительского элемента Consumer.

+0

Это имеет смысл, что вы говорите. Я редактирую свой оригинальный пост, потому что понял, что фрагмент, который у меня есть в столбце «Потребитель», не прав. Как я могу указать, какое пространство имён принадлежит тоже, не помещая xmlns = "http://tempuri.org/newincomingxml.xsd" в каждую строку? –

+0

'<Потребители ... xmlns: c =" http://tempuri.org/newincomingxml.xsd "...> ... ...' –