Ajouter un espace de noms sur un xml généré par une requête
J'essaie d'ajouter un espace de noms xml à l'aide AVEC XMLNAMESPACES.
Lorsque j'exécute mes requêtes, l'espace de noms est ajouté à l'élément racine, mais avec le deuxième élément que j'ai xmlns="" ainsi... et je voudrais le supprimer...
J'ai fourni un exemple:
Requêtes pour la création de la table et les données:
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
Je générer du xml avec ces requêtes:
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 généré:
<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>
Alors, j'essaie ceci:
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')
le code xml généré est maintenant:
<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>
Vous devez vous connecter pour publier un commentaire.
Daniel, le
xmlns=""
sur le<DataRows>
élément de moyens, de définir l'espace de noms par défaut pour<DataRows>
et tous les descendants à aucun espace de noms.En d'autres termes, si le
xmlns=""
n'étaient pas là, l'ensemble de l'arborescence XML serait dans lehttp://www.mynamespace.com
espace de noms. (Parce que les déclarations d'espace de noms sont héritées, jusqu'à ce que remplacée.) Et c'est probablement ce que vous vouliez. Mais SQL Server pense que tu voulais seulement le<Names>
de l'élément dans l'espace de nom. C'est donc "utilement" retrait de l'espace de noms par défaut pour tous les éléments descendants.La solution, alors, c'est à dire à SQL Server qui tous les éléments, et pas seulement
<Names>
, devrait être dans lehttp://www.mynamespace.com
espace de noms.(Si vous me demandez comment faire, la réponse est que je ne sais pas SQL Server fonctionnalités XML que bien. Mais peut-être de clarifier ce qui se passe et ce qui doit arriver va vous aider à comprendre comment faire pour y arriver.)
Mise à jour à la lumière de nouvelles offres et de requête de sortie:
@Daniel, votre sortie est maintenant techniquement correcte. Tous les éléments de sortie sont dans le
http://www.mynamespace.com
espace de noms. Lexmlns="http://www.mynamespace.com"
déclarations sur la<Row>
éléments sont redondants... ils ne changent pas les noms de tout élément.Vous pouvez ne pas l'aimer, le supplément de déclarations, mais ils ne devraient pas faire toute la différence pour toute l'aval des outils de XML.
Si vous voulez les supprimer, et si vous ne pouvez pas le faire en modifiant la requête SQL, vous pouvez exécuter le XML résultant à travers une feuille de style XSLT. Même un la transformation de l'identité sera probablement se débarrasser de la redondante déclarations d'espace de noms, je crois.
WITH XMLNAMESPACES (DEFAULT 'http://www.mynamespace.com')
sur votre première SÉLECTIONNEZ dans laSET @XML = ...
déclaration? (ainsi que là où elle ne l'est déjà)xmlns=""
) sur les éléments de Ligne, mais je ne suis pas sûr. Un exemple vaut mille mots.