【问题标题】:Why does Replace '&' with '&' not work for XML data?为什么将“&”替换为“&”不适用于 XML 数据?
【发布时间】:2019-06-29 14:34:56
【问题描述】:

我需要下载一个 XML 文件,它的数据是从存储过程中检索的。 我的问题是如果数据包含任何“&”符号,在 XML 文件中它显示为

'&'

我在我的过程中使用了 REPLACE 函数,如下所示,但是...

SELECT @V_NAME = REPLACE(@V_NAME, ' & ', ' & ');

UPDATE #TMP_RS_XML
SET OBJECT_ID=@V_ID,
    FNAME=@V_FILE,
    DOCUMENT=(SELECT @V_NAME as 'Description',
    ...

现在,输出是:

&

【问题讨论】:

  • && 的 XML 编码,因为 & 是一个特殊字符。
  • 至于为什么你的替换“不起作用”,你用&替换&,而不是用&替换&。但正如朱哈尔所说,&是& 的 XML 编码形式,所以你不应该删除它。
  • 因此,您将& 字符替换为&。当用这种方式替换&中的&时,结果当然是&。不可能是别的。
  • 您可能在 html 文档中嵌入了 XML。您需要使用 System.Net.WebUtility.HtmlDecode(string) 或 System.Net.WebUtility.HtmlEncode(string) 参见 wiki:en.wikipedia.org/wiki/…
  • 在使用替换功能之前,例如:E.R. MANAGEMENT & CO. KG 被显示而不是 E.R. MANAGEMENT & CO. KG。我在网上发现我们需要用& 替换所有&,所以我们将在我们的XML 文档中得到&。这就是我使用这种替换的原因。

标签: sql xml sql-server-2012


【解决方案1】:

这不是应该的工作方式......

XML 不仅仅是一些带有花哨附加功能的文本,而且具有非常严格的规则。作为任何基于文本的 容器,您需要魔法词特殊字符 来告诉消费者什么是内容以及什么是标记。

XML 中最重要的标记字符是 <> - 当然。如果您希望这些字符成为您内容的一部分,则必须替换它们。这是通过 xml 实体 完成的。

在内容中,任何 XML 实体都将以 & 符号开头(< 输出为 <),因此 & 符号是第三个最重要的特殊字符。如果您想在内容中使用 & 符号,则必须使用实体 (&) 作为代码,在这个地方我们需要 & 符号

当您查看 XML 时,您必须区分所看到的文本和从 XML 中提取的实际内容

试试这个:

DECLARE @SomeStringWithSpecialCharacters NVARCHAR(200)=N'This & that -> let''s see, why how some foreign characters behave: அரிச். And what about a line break?' + CHAR(13) + CHAR(10) + 'Here is the second line. And an unprintable?' + CHAR(2);

--这里我们使用FOR XML,所有的转义都是隐式完成的

SELECT @SomeStringWithSpecialCharacters AS TestIt FOR XML PATH('test');                     

结果

<test>
  <TestIt>This &amp; that -&gt; let's see, why how some foreign characters behave: அரிச். And what about a line break?
Here is the second line. And an unprintable?&#x2;</TestIt>
</test>

现在,我将 XML 从第一部分中取出,并将其放入 XML 类型的变量中。
注意:我必须删除 &amp;#x2; 实体,检查一下...

DECLARE @SomeXML XML=
N'<test>
  <TestIt>This &amp; that -&gt; let''s see, why how some foreign characters behave: அரிச். And what about a line break?
Here is the second line. And an unprintable?</TestIt>
</test>';

--现在我们使用 .value() 来处理原生 XML:

SELECT @SomeXML.value('(/test/TestIt/text())[1]','nvarchar(max)');

结果是所有实体都被重新分隔:

This & -> let's see, why how some foreign characters behave: அரிச். And what about a line break?
Here is the second line. And an unprintable?

一般提示是:切勿自行更换。将内容推入 XML 需要转义,而从 XML 中读取内容 则需要相反。当您使用适当的工具时,所有这些都是隐含地为您完成的。

【讨论】:

    【解决方案2】:

    '&' 是从 ' &amp ; 中渲染出来的特殊字符。 '

    这里的最佳做法是解码 XML,在下面添加参考:

    https://docs.microsoft.com/en-us/dotnet/api/system.web.httputility.htmldecode?redirectedfrom=MSDN&view=netframework-4.8#overloads

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 2019-03-10
      • 2020-01-14
      • 2015-10-04
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多