ホームページ > データベース > mysql チュートリアル > ネストされた FOR XML PATH クエリで冗長な名前空間宣言を削除するにはどうすればよいですか?

ネストされた FOR XML PATH クエリで冗長な名前空間宣言を削除するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-31 02:44:09
オリジナル
161 人が閲覧しました

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

ネストされた 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 クエリの結果をラップし、不要な名前空間を効果的に削除します。宣言.

  1. @xml AS [xml!1!!xmltext]: このディレクティブは、ダミーのルート ノードを除く、FOR XML PATH 結果から抽出する XML コンテンツを指定します。
  2. 'http://test.com/order' AS [xml!1!xmlns]: このディレクティブは、最も外側のノードに必要な名前空間を明示的に設定し、ネストされたノードでの重複した宣言を排除します。

結果

このクエリからの出力は次のようになります:

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート