簡體   English   中英

在 SQL Server 中將 XML UTF-8 編碼的字符串轉換為 XML 數據類型

[英]Convert an XML UTF-8 encoded string to XML datatype in SQL Server

使用 CAST(AS XML) 轉換 XML 字符串在許多情況下都按預期工作,但如果字符串包含重音字符,則會失敗並顯示錯誤“非法 xml 字符”。

此示例因錯誤“XML 解析:第 2 行,字符 8,非法 xml 字符”而失敗:

declare @Text VARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>níveis porém alocação</ROOT>'

select CAST(@Text AS XML)

根據XML 規范,它們都是合法的 XML 字符,但是用“X”字符替換重音字符將導致成功的 CAST:

declare @MessageText VARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-8"?>
<ROOT>nXveis porXm alocaXXo</ROOT>'

select CAST(@MessageText AS XML)

結果: <ROOT>nXveis porXm alocaXXo</ROOT>

此外,相同的 XML 但 UTF-16 編碼,莫名其妙地工作:

declare @MessageText NVARCHAR(max) = 
'<?xml version="1.0" encoding="UTF-16"?>
<ROOT>níveis porém alocação</ROOT>'

select CAST(@MessageText AS XML)

結果: <ROOT>níveis porém alocação</ROOT>

這些字符在 UTF-8 中是非法的嗎? 或者有更好的方法來轉換成 XML 數據類型嗎?

SQL Server 在內部去除 XML 數據類型的任何 XML 聲明序言並使用 UTF-16 編碼。 以下是如何正確處理您的用例。

數據庫

-- Method #1
DECLARE @Text NVARCHAR(MAX) = N'<ROOT>níveis porém alocação</ROOT>';
SELECT CAST(@Text AS XML);

-- Method #2
DECLARE @MessageText NVARCHAR(MAX) = 
'<?xml version="1.0" encoding="UTF-16"?>
<ROOT>níveis porém alocação</ROOT>';

SELECT CAST(@MessageText AS XML);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM