首頁 > 資料庫 > mysql教程 > 如何處理嵌套 FOR XML PATH 查詢中的冗餘 XML 命名空間聲明?

如何處理嵌套 FOR XML PATH 查詢中的冗餘 XML 命名空間聲明?

DDD
發布: 2024-12-31 07:54:09
原創
596 人瀏覽過

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

處理巢狀FOR XML PATH 查詢中的重複XML 命名空間

使用FOR XML PATH 和WITH XMLNAMESPACES 來定義預設命名空間時定義預設命名空間時,不需要的命名空間聲明可以填入使用FOR的巢狀查詢中的頂層節點

問題:

考慮以下範例:

;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

一種方法涉及在後續查詢中使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板