从SQL Server中的XML中删除转义字符



如何在XML字段中显示&

DECLARE @xml   XML
SET @xml = (SELECT 'test&test' AS xml_entity 
FOR XML PATH('xml_merge'),TYPE)
SELECT @xml

结果显示&

<xml_merge>   <xml_entity>test&amp;test</xml_entity> </xml_merge>

我也尝试过使用CDATA标签,但没有解决问题:

DECLARE @xml   XML
SET @xml = (SELECT '<![CDATA[test&test]]>' AS xml_entity 
FOR XML PATH('xml_merge'),TYPE)
SELECT @xml
<xml_merge>
<xml_entity>&lt;![CDATA[test&amp;test]]&gt;</xml_entity>
</xml_merge>

如何处理?我需要显示&而不是&amp;

预期结果

<xml_merge>   <xml_entity>test&test</xml_entity> </xml_merge>

Ampersand是XML中的一个特殊字符。这就是为什么它需要其实体&amp;

请尝试以下SQL。它将向您显示,在SELECT ...作为VARCHAR((之后,实体就不存在了。它仅在XML数据类型中保持原样。

您可以在这里查看:2.4字符数据和标记

SQL

DECLARE @xml XML; 
SET @xml = (SELECT 'test & test' AS xml_entity 
FOR XML PATH('xml_merge'),TYPE);
SELECT @xml;
SELECT @xml.value('(/xml_merge/xml_entity/text())[1]','VARCHAR(100)') AS xml_entity;

输出

xml_entity
test & test

这似乎是一个X/Y问题。您希望将无效的XML作为XML返回。如果您想要字符串值,那么您可以将其作为值从XML中提取出来,转义符将被删除,但是,如果您想要上面概述的无效XML,那么您必须将XML转换为字符串,然后替换转义符。

DECLARE @xml   XML
SET @xml = (SELECT 'test&test' AS xml_entity 
FOR XML PATH('xml_merge'),TYPE)
SELECT @xml

DECLARE @XmlBlob NVARCHAR(MAX)=CAST(@Xml AS NVARCHAR(MAX))
SELECT REPLACE(@XmlBlob,'&amp;','&')

<xml_merge>lt;xml_entity>测试&测试<xml_entity>lt/xml_merge>

最新更新