Maison > base de données > tutoriel mysql > Comment gérer les déclarations d'espace de noms XML redondantes dans les requêtes imbriquées FOR XML PATH ?

Comment gérer les déclarations d'espace de noms XML redondantes dans les requêtes imbriquées FOR XML PATH ?

DDD
Libérer: 2024-12-31 07:54:09
original
601 Les gens l'ont consulté

How to Handle Redundant XML Namespace Declarations in Nested FOR XML PATH Queries?

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')
Copier après la connexion

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
Copier après la connexion

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')
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal