ホームページ >データベース >mysql チュートリアル >ネストされた FOR XML PATH クエリで冗長な XML 名前空間宣言を処理する方法
ネストされた 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 サイトの他の関連記事を参照してください。