집 >데이터 베이스 >MySQL 튜토리얼 >중첩된 FOR XML PATH 쿼리에서 중복 XML 네임스페이스 선언을 처리하는 방법은 무엇입니까?
중첩된 FOR XML PATH 쿼리에서 반복되는 XML 네임스페이스 처리
WITH XMLNAMESPACES와 함께 FOR XML PATH를 활용하여 기본 네임스페이스, 원하지 않는 네임스페이스를 정의하는 경우 선언은 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 사용
한 가지 접근 방식은 후속 쿼리에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!