Sql-Server

如何在轉換為 XML 之前在 TSQL 中轉義 XML 字元?

  • April 21, 2020

我有XML 結構,它是我的儲存過程的輸入參數。**它包含帶有&的元素(在 XML 中轉義)。當我將該元素提取到VARCHAR我收到&**時,它不是有效的 XML 字元。在再次轉換為 XML 之前,我需要對其進行轉義。沒有 怎麼辦REPLACE

我有以下文字:param1=xyz¶2=dasdasdfdas¶m3。它是查詢字元串的一部分。我將其轉換XML為 XML 結構的一部分並將其發送:

<zzz xmlns="http://example.com">
 <aaa>aaa</aaa>
 <bbb>param1=xyz&para2=dasdasdfdas&param3</bbb>
</zzz>

在儲存過程中,我需要提取它。我這樣做:

ISNULL(NULLIF(LTRIM(RTRIM(@XMLInput.value('declare default element namespace "http://example.com"; (zzz/bbb)[1]', 'NVARCHAR(250)'))), ''), '');

之後我的值包含普通文本(& -s 沒有轉義 - &)。

經過一些處理後,我需要將該字元串放入其他 XML 中。我做:

CAST( ... AS XML);

因為**&** -s 沒有被轉義,所以我得到了錯誤。

用於for xml path創建 XML 而不是強制轉換。

select @YourVariable for xml path(''), type

路徑表達式中的空字元串和返回的列上沒有別名將使您的字元串返回為 xml。

這是完全有效的 XML。如果您bbb使用 XML 數據類型的方法提取元素.value,它將在該點被取消實體化,例如

結果

您可以提取和添加元素而無需特殊處理或替換,例如使用.modifyXML 數據類型的方法:

DECLARE @xml XML = '<zzz xmlns="http://example.com">
 <aaa>aaa</aaa>
 <bbb>param1=xyz&para2=dasdasdfdas&param3</bbb>
</zzz>'

SELECT @xml [before], DATALENGTH(@xml) dl

DECLARE @b VARCHAR(100)

;WITH XMLNAMESPACES ( DEFAULT 'http://example.com' )
SELECT @b = @xml.value('(zzz/bbb/text())[1]', 'VARCHAR(100)')

SELECT @b

SET @xml.modify('declare default element namespace "http://example.com"; insert element bbb { sql:variable("@b") } after (zzz/bbb)[1]')

SELECT @xml [after], DATALENGTH(@xml) dl

引用自:https://dba.stackexchange.com/questions/143132