ネストされた FOR XML PATH クエリでの冗長な名前空間宣言の削除
WITH XMLNAMESPACES を使用して宣言されたデフォルトの名前空間を持つ FOR XML PATH クエリでは、次のことが一般的です。ネストされたクエリで重複した名前空間宣言が発生しました。この記事では、この問題に対処し、最適な解決策を提供します。
この問題は、サブクエリが FOR XML を使用し、外部クエリからデフォルトの名前空間を継承する場合に発生します。これにより、サブクエリのノードに対して複数の名前空間宣言が行われます。さまざまなオンライン ソリューションがありますが、この問題を完全に解決できるものはありません。
最適なソリューション
広範な実験の結果、次のソリューションが最も効果的であると考えられています。
DECLARE @Order TABLE (OrderID INT, OrderDate DATETIME) DECLARE @OrderDetail TABLE (OrderID INT, ItemID VARCHAR(1), Name VARCHAR(50), Qty INT) INSERT @Order VALUES (1, '2010-01-01'), (2, '2010-01-02') INSERT @OrderDetail VALUES (1, 'A', 'Drink', 5), (1, 'B', 'Cup', 2), (2, 'A', 'Drink', 2), (2, 'C', 'Straw', 1), (2, 'D', 'Napkin', 1) -- FOR XML PATH query 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) -- Magic happens here! SELECT 1 AS Tag ,NULL AS Parent ,@xml AS [xml!1!!xmltext] ,'http://test.com/order' AS [xml!1!xmlns] FOR XML EXPLICIT
このソリューションは、FOR XML EXPLICIT クエリを利用して FOR XML PATH クエリの結果をラップし、不要な名前空間を効果的に削除します。宣言.
結果
このクエリからの出力は次のようになります:
<xml xmlns="http://test.com/order"> <Order OrderID="1"> <Item ItemID="A">Drink</Item> <Item ItemID="B">Cup</Item> </Order> <Order OrderID="2"> <Item ItemID="A">Drink</Item> <Item ItemID="C">Straw</Item> <Item ItemID="D">Napkin</Item> </Order> </xml>
名前空間宣言は現在、意図したとおり、ルート ノード。
以上がネストされた FOR XML PATH クエリで冗長な名前空間宣言を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。