为什么用“&”替换“&”对XML数据不起作用?

时间:2019-06-29 14:34:56

标签: sql xml sql-server-2012

我需要下载一个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',
    ...

现在,输出为:

&

2 个答案:

答案 0 :(得分:1)

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

XML不仅是带有额外花哨的文本,而且具有非常严格的规则。与任何基于文本的容器一样,您将需要魔术词特殊字符来告诉消费者什么是内容,什么是标记。

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

在内容中,任何XML实体都将以“&”号开头(<&lt;开头),因此,“&”号是第三重要的特殊字符。如果您要在内容中使用&符号,则必须在该位置使用实体(&amp;)作为的代码,我们希望在此使用&符号。

在查看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类型的变量中。
注意:我必须删除&#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 将需要相反。当您使用适当的工具时,所有这些隐式地为您完成。

答案 1 :(得分:0)

'&'是从'&amp;表示出来的特殊字符。 '

此处的最佳做法是对XML进行解码,并在下面添加引用:

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