如何在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&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><![CDATA[test&test]]></xml_entity>
</xml_merge>
如何处理?我需要显示&
而不是&
预期结果
<xml_merge> <xml_entity>test&test</xml_entity> </xml_merge>
Ampersand是XML中的一个特殊字符。这就是为什么它需要其实体&
请尝试以下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,'&','&')
<xml_merge>lt;xml_entity>测试&测试<xml_entity>lt/xml_merge>