2010-09-28 12 views
6

Próbuję dodać przestrzeń nazw w xml za pomocą Z XMLNAMESPACES.Dodaj przestrzeń nazw w xml generowanym przez zapytanie

Kiedy wykonać moje zapytania, przestrzeń nazw jest dodany do elementu głównego, ale z drugiego elementu mam xmlns = „”, a także ... i chciałbym, aby usunąć to ...

I, pod warunkiem Przykład:

zapytania do tworzenia tabeli i dane:

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 

generowania xml z tych zapytań:

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

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

Więc próbuję to także:

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 generowany jest teraz:

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

Odpowiedz

5

Daniela, xmlns="" na <DataRows> elementów pomocą , ustaw domyślny obszar nazw dla <DataRows> i wszystkich potomków na bez przestrzeni nazw.

Innymi słowy, jeśli nie było tam xmlns="", całe drzewo XML znajdowałoby się w przestrzeni nazw http://www.mynamespace.com. (Ponieważ deklaracje przestrzeni nazw są dziedziczone, dopóki nie zostaną przesłonięte). I prawdopodobnie tego właśnie chciałeś. Ale SQL Server uważa, że ​​chciałbyś, aby tylko element <Names> znajdował się w tym obszarze nazw. Więc "pomaga", usuwając domyślny obszar nazw dla wszystkich elementów potomnych.

Rozwiązaniem jest więc powiedzieć, że SQL Server wszystkie elementy, nie tylko <Names> powinny być w przestrzeni nazw http://www.mynamespace.com.

(Jeśli zapytasz mnie, jak to zrobić, odpowiedź brzmi: nie znam dobrze funkcji SQL Server XML, ale może wyjaśnienie, co się dzieje i co musi się wydarzyć, pomoże ci wymyślić, jak to zrobić.)

Aktualizacja w świetle niedawno pisał zapytania i wyjścia:

@Daniel, Twój wynik jest obecnie technicznie poprawne. Wszystkie elementy wyjściowe znajdują się w przestrzeni nazw http://www.mynamespace.com. Deklaracje xmlns="http://www.mynamespace.com" na elementach <Row> są nadmiarowe ... nie zmieniają przestrzeni nazw żadnego elementu.

Może ci się nie podobać dodatkowe deklaracje, ale nie powinny one wpływać na żadne dalsze narzędzia XML.

Jeśli chcesz je usunąć, a jeśli nie możesz tego zrobić, poprawiając zapytanie SQL, możesz uruchomić wynikowy XML za pomocą arkusza stylów XSLT. Nawet chyba identity transformation prawdopodobnie pozbędzie się nadmiarowych deklaracji przestrzeni nazw.

+0

@Daniel, co się stanie, jeśli wstawisz 'WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')' na początkowym SELECT w instrukcji 'SET @XML = ...'?(jak również tam, gdzie już jest) – LarsH

+0

Próbowałem, ale nie mogę ustawić Z XMLNAMESPACES w SET ... Inną rzeczą, faktycznie za każdym razem istnieje SELECT, przestrzeń nazw jest ustawiona przez serwer SQL. – Dan

+0

Tak, zamieniłem SET na SELECT i umieszczam WITH XMLNAMESPACES tuż przed. Zapytanie jest teraz wykonywane, ale wystarczy umieścić przestrzeń nazw za pomocą elementów "Wiersz" ... – Dan

Powiązane problemy