【问题标题】:Remove Escaped character from XML in SQL Server从 SQL Server 中的 XML 中删除转义字符
【发布时间】:2020-10-08 18:03:52
【问题描述】:

& 如何在 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;amp; 而不是&amp;amp;

预期结果

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

【问题讨论】:

    标签: sql-server xml tsql


    【解决方案1】:

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

    请尝试以下 SQL。它会告诉你,在 SELECT ... 作为 VARCHAR() 之后,实体消失了。它仅在 XML 数据类型中保持原样。

    您可以在这里查看:2.4 Character Data and Markup

    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
    

    【讨论】:

    • @Bijujose,很高兴听到我的回答为您澄清了一些 XML 特性。请不要忘记将其标记为答案。
    【解决方案2】:

    这似乎是一个 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;','&')
    

    测试和测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2016-01-23
      • 2020-03-16
      相关资源
      最近更新 更多