3

SQL Server 2005 上的以下代码片段在与号“&”上失败:

select cast('<name>Spolsky & Atwood</name>' as xml)

有谁知道解决方法?

更长的解释,我需要更新 XML 列中的一些数据,并且我通过将 XML 值转换为 varchar 来使用搜索和替换类型 hack,使用此转换执行替换和更新 XML 列。

4

5 回答 5

6

它不是有效的 XML。使用&amp;

select cast('<name>Spolsky &amp; Atwood</name>' as xml)
于 2009-07-13T13:03:34.893 回答
6
select cast('<name>Spolsky &amp; Atwood</name>' as xml)

XML标准不允许标签内的文字 & 符号XML,并且这样的文档将无法被任何XML解析器解析。

AnXMLSerializer()将输出 &HTML编码。

以下代码:

using System.Xml.Serialization;

namespace xml
{
    public class MyData
    {
        public string name = "Spolsky & Atwood";
    }

    class Program
    {
        static void Main(string[] args)
        {
            new XmlSerializer(typeof(MyData)).Serialize(System.Console.Out, new MyData());
        }
    }
}

将输出以下内容:

<?xml version="1.0" encoding="utf-8"?>
<MyData
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>Spolsky &amp; Atwood</name>
</MyData>

, 用一个&amp;代替&.

于 2009-07-13T13:04:07.967 回答
4

您还需要对文本进行 XML 转义。

因此,让我们回溯并假设您正在将该字符串构建为:

SELECT '<name>' + MyColumn + '</name>' FROM MyTable

你想做更多类似的事情:

SELECT '<name>' + REPLACE( MyColumn, '&', '&amp;' ) + '</name>' FROM MyTable

当然,您可能应该满足其他实体的需求:

SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&amp;' ), '''', '&apos;' ), '"', '&quot;' ), '<', '&lt;' ), '>', '&gt;' ) + '</name>' FROM MyTable
于 2009-07-13T13:07:19.667 回答
3

在 SQL 中使用 XML 时,使用内置函数而不是手动转换它会更安全。

以下代码将构建一个适当的 SQL XML 变量,该变量看起来像基于原始字符串的所需输出:

DECLARE @ExampleString nvarchar(40)
    , @ExampleXml xml

SELECT  @ExampleString = N'Spolsky & Atwood'

SELECT  @ExampleXml =
    (
        SELECT  'Spolsky & Atwood' AS 'name'
        FOR XML PATH (''), TYPE
    )

SELECT  @ExampleString , @ExampleXml
于 2010-08-23T23:32:31.663 回答
0

正如 John 和 Quassnoi 所说,&它本身是无效的。这是因为 & 字符是字符实体的开始 - 用于指定无法按字面表示的字符。有两种形式的实体 - 一种通过名称指定字符(例如,&amp;&quot;),另一种通过代码指定字符(我相信它是 Unicode 字符集中的代码位置,但不确定。例如,&#34;应该表示双引号)。

因此,要在 HTML 文档中包含文字&,您必须指定它的实体:&amp;。您可能会遇到的其他常见问题是&lt;for <&gt;for>&quot;for "

于 2009-07-13T13:11:51.433 回答