ホームページ >データベース >mysql チュートリアル >ネストされた FOR XML PATH クエリで冗長な XML 名前空間宣言を処理する方法

ネストされた FOR XML PATH クエリで冗長な XML 名前空間宣言を処理する方法

DDD
DDDオリジナル
2024-12-31 07:54:09598ブラウズ

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

ネストされた FOR XML PATH クエリで繰り返される XML 名前空間の処理

FOR XML PATH を WITH XMLNAMESPACES とともに使用してデフォルトの名前空間、不要な名前空間を定義する場合宣言により、FOR を使用するネストされたクエリの最上位ノードを設定できます。 XML.

問題:

次の例を考えてみましょう:

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

この場合、名前空間宣言 uri:animal が重複して現れます。ネストされたクエリの脚ノード。

可能解決策:

解決策 1: FOR XML EXPLICIT を使用する

1 つの方法では、後続のクエリで FOR XML EXPLICIT を使用して、不要な名前空間を削除します。

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

このクエリは、xml!1!!xmltext ディレクティブを使用してルートのコンテンツを抽出します。

解決策 2: XMLNS 名前空間を削除する

別のアプローチでは、ネストされたノードから XMLNS 名前空間宣言を削除します。クエリ:

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

結論:

最適なソリューションは、クエリの特定の要件と複雑さによって異なります。 FOR XML EXPLICIT メソッドは柔軟性に優れていますが、複雑なクエリの場合はより面倒になる可能性があります。一方、XMLNS 名前空間を削除すると、より簡単なアプローチが得られます。

以上がネストされた FOR XML PATH クエリで冗長な XML 名前空間宣言を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。