Gestion des espaces de noms XML répétés dans les requêtes FOR XML PATH imbriquées
Lors de l'utilisation de FOR XML PATH avec WITH XMLNAMESPACES pour définir un espace de noms par défaut, un espace de noms indésirable Les déclarations peuvent remplir les nœuds de niveau supérieur dans des requêtes imbriquées qui utilisent FOR XML.
Le Problème :
Considérons l'exemple suivant :
;WITH XmlNamespaces( default 'uri:animal') SELECT a.c2 AS "@species", (SELECT l.c3 AS "text()" FROM t2 l WHERE l.c2 = a.c1 FOR XML PATH('leg'), TYPE) AS "legs" FROM t1 a FOR XML PATH('animal'), ROOT('zoo')
Dans ce cas, la déclaration d'espace de noms uri:animal apparaît de manière redondante dans le nœud legs de la requête imbriquée.
Solutions possibles :
Solution 1 : Utilisation de FOR XML EXPLICIT
Une approche consiste à utiliser FOR XML EXPLICIT dans une requête ultérieure pour supprimer les espaces de noms indésirables :
DECLARE @xml XML = (SELECT OrderID AS "@OrderID", (SELECT ItemID AS "@ItemID", Name AS "data()" FROM @OrderDetail WHERE OrderID = o.OrderID FOR XML PATH ('Item'), TYPE) FROM @Order o FOR XML PATH ('Order'), ROOT('dummyTag'), TYPE); SELECT 1 AS Tag ,NULL AS Parent ,@xml AS [xml!1!!xmltext] ,'http://test.com/order' AS [xml!1!xmlns] FOR XML EXPLICIT
Cette requête utilise la directive xml!1!!xmltext pour extraire le contenu du nœud racine, en supprimant l'espace de noms redondant.
Solution 2 : suppression du XMLNS Espace de noms
Une approche alternative consiste à supprimer la déclaration d'espace de noms XMLNS de la requête imbriquée :
WITH XmlNamespaces( default 'uri:animal') SELECT a.c2 AS "@species", (SELECT l.c3 AS "text()" FROM t2 l WHERE l.c2 = a.c1 FOR XML PATH('leg'), REMOVE(NAMESPACES(), 'default'), TYPE) AS "legs" FROM t1 a FOR XML PATH('animal'), ROOT('zoo')
Conclusion :
La solution optimale dépend des exigences spécifiques et de la complexité de la requête. La méthode FOR XML EXPLICIT offre une plus grande flexibilité mais peut être plus fastidieuse pour les requêtes complexes, tandis que la suppression de l'espace de noms XMLNS offre une approche plus simple.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!