2010-09-28 15 views
6

Я пытаюсь добавить пространство имен в xml с помощью XMLNAMESPACES.Добавить пространство имен в xml, сгенерированное запросом

Когда я исполняю свои запросы, пространство имена добавляются с корневым элементом, но со вторым элементом я имею Xmlns = «», а также ... и я хотел бы удалить, что ...

я предоставил пример:

запросы для создания таблицы и данные:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[tblTest](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](30) NOT NULL, 
CONSTRAINT [PK_tblTest] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
SET IDENTITY_INSERT [dbo].[tblTest] ON 
INSERT [dbo].[tblTest] ([Id], [Name]) VALUES (1, N'Barack') 
INSERT [dbo].[tblTest] ([Id], [Name]) VALUES (2, N'Nicolas') 
INSERT [dbo].[tblTest] ([Id], [Name]) VALUES (3, N'Brian') 
SET IDENTITY_INSERT [dbo].[tblTest] OFF 

я генерировать XML с этими запросами:

DECLARE @Xml xml 
SET @Xml = (SELECT Id, Name 
      FROM dbo.tblTest 
      FOR XML PATH('Row'), ROOT('DataRows')); 

WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com') 
SELECT @Xml FOR XML PATH('Names'); 

Xml генерироваться:

<Names xmlns="http://www.mynamespace.com"> 
    <DataRows xmlns=""> 
    <Row> 
     <Id>1</Id> 
     <Name>Barak</Name> 
    </Row> 
    <Row> 
     <Id>2</Id> 
     <Name>Nicolas</Name> 
    </Row> 
    <Row> 
     <Id>3</Id> 
     <Name>Brian</Name> 
    </Row> 
    </DataRows> 
</Names> 

Итак, я стараюсь это так:

DECLARE @Xml xml 

;WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com') 
SELECT @Xml = (SELECT Id, Name 
    FROM dbo.tblTest 
    FOR XML PATH('Row'), TYPE); 

;WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com') 
SELECT @Xml 
FOR XML PATH('DataRows'), ROOT('Names') 

XML-генерироваться теперь:

<Names xmlns="http://www.mynamespace.com"> 
    <DataRows> 
    <Row xmlns="http://www.mynamespace.com"> 
     <Id>1</Id> 
     <Name>Barak</Name> 
    </Row> 
    <Row xmlns="http://www.mynamespace.com"> 
     <Id>2</Id> 
     <Name>Nicolas</Name> 
    </Row> 
    <Row xmlns="http://www.mynamespace.com"> 
     <Id>3</Id> 
     <Name>Brian</Name> 
    </Row> 
    </DataRows> 
</Names> 

ответ

5

Даниилов xmlns="" на средства <DataRows> элементов , установите пространство имен по умолчанию для <DataRows> и всех потомков без пространства имен.

Другими словами, если бы не было xmlns="", все дерево XML было бы в пространстве имен http://www.mynamespace.com. (Поскольку объявления пространства имен унаследованы, до переопределения.) И это, вероятно, то, что вы хотели. Но SQL Server считает, что вы хотите, чтобы в этом пространстве имен находился только элемент <Names>. Таким образом, «полезно» удаляет пространство имен по умолчанию для всех элементов-потомков.

решение, то должен сказать, что SQL Server все элементы, а не только <Names>, должны быть в http://www.mynamespace.com пространстве имен.

(Если вы спросите меня, как это сделать, я не знаю, как хорошо это проявляют возможности SQL Server XML. Но, возможно, выяснение того, что происходит и что должно произойти, поможет вам понять, как это сделать.)

Update в свете вновь публикуемую запроса и вывода:

@Daniel, ваш выход теперь технически правильно. Все выходные элементы находятся в пространстве имен http://www.mynamespace.com. Объявления xmlns="http://www.mynamespace.com" на элементах <Row> являются избыточными ... они не меняют пространство имен какого-либо элемента.

Возможно, вам не нравятся дополнительные объявления, но они не должны иметь никакого значения для любых инструментов XML вниз.

Если вы хотите удалить их, и если вы не можете этого сделать, настроив SQL-запрос, вы можете запустить полученный XML через таблицу стилей XSLT. Я думаю, что даже identity transformation, вероятно, избавится от избыточных объявлений пространства имен.

+0

@ Daniel, что произойдет, если вы положите 'WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')' на ваш начальный SELECT в 'SET @XML = ...' инструкции?(а также где он уже есть) – LarsH

+0

Я пробовал, но я не могу установить WITH XMLNAMESPACES в SET ... Другое дело, на самом деле каждый раз, когда есть SELECT, пространство имен устанавливается Sql Server. – Dan

+0

Итак, я заменил SET на SELECT, и я поставил WITH XMLNAMESPACES непосредственно перед этим. Запрос выполняется сейчас, но просто разместите пространство имен с элементами «Row» ... – Dan

Смежные вопросы