Добавить пространство имен в xml, сгенерированном запросом - PullRequest
6 голосов
/ 29 сентября 2010

Я пытаюсь добавить пространство имен в xml, используя WITH XMLNAMESPACES.

Когда я выполняю свои запросы, пространство имен добавляется с корневым элементом, но со вторым элементом у меня также есть 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>

Итак, я также пытаюсь это сделать:*

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

1 Ответ

5 голосов
/ 29 сентября 2010

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

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

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

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

Обновление в свете недавно опубликованного запроса и вывода:

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

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

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

...