2010-09-28 12 views
6

Intento agregar un espacio de nombres en xml usando WITH XMLNAMESPACES.Agregue un espacio de nombres en un xml generado por una consulta

Cuando ejecuto mis consultas, se añade el espacio de nombres con el elemento raíz, pero con el segundo elemento tengo xmlns = "", así ... y me gustaría quitar ese ...

proporcioné un ejemplo:

consultas para la creación de la tabla y los datos:

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 

genero el xml con estas consultas:

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

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

Por lo tanto, trato de esto también:

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

el XML generado es ahora:

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

Respuesta

5

Daniel, el xmlns="" en los <DataRows> medios de elemento , establezca el espacio de nombre predeterminado para <DataRows> y todos los descendientes en ningún espacio de nombres.

En otras palabras, si el xmlns="" no estuviera allí, todo el árbol XML estaría en el espacio de nombres http://www.mynamespace.com. (Porque las declaraciones del espacio de nombres se heredan, hasta que se anulan). Y eso es probablemente lo que usted quería. Pero SQL Server cree que solo quería que el elemento <Names> estuviera en ese espacio de nombres. Por lo tanto, es "útil" eliminar el espacio de nombres predeterminado para todos los elementos descendientes.

La solución, entonces, es decirle a SQL Server que todos los elementos, no sólo <Names>, deben estar en el espacio de nombres http://www.mynamespace.com.

(Si me preguntas cómo hacerlo, la respuesta es que no sé SQL Server XML funciona bien. Pero quizás aclarar lo que está sucediendo y lo que debe suceder te ayudará a descubrir cómo hacerlo realidad.)

actualización a la luz de consulta recién publicado y salida:

@ Daniel, su salida es ahora técnicamente correcto. Todos los elementos de salida están en el espacio de nombres http://www.mynamespace.com. Las declaraciones xmlns="http://www.mynamespace.com" en los elementos <Row> son redundantes ... no cambian el espacio de nombres de ningún elemento.

Puede que no les gusten las declaraciones adicionales, pero no deberían hacer ninguna diferencia en las herramientas XML posteriores.

Si desea eliminarlos, y si no puede hacerlo ajustando la consulta SQL, podría ejecutar el XML resultante a través de una hoja de estilos XSLT. Incluso un identity transformation probablemente se deshaga de las declaraciones redundantes del espacio de nombres, creo.

+0

@Daniel, ¿qué ocurre si coloca 'WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')' en su SELECT inicial en la instrucción 'SET @XML = ...'?(y donde ya está) – LarsH

+0

Lo intenté, pero no puedo establecer un WITH XMLNAMESPACES en un SET ... Otra cosa, de hecho, cada vez que hay un SELECT, el espacio de nombres lo establece el servidor SQL. – Dan

+0

Así que, he reemplazado el SET por un SELECT y puse el WITH XMLNAMESPACES justo antes. La consulta se ejecuta ahora pero solo coloca el espacio de nombres con los elementos "Fila" ... – Dan

Cuestiones relacionadas