SQL Server 2005 上的以下代码片段在与号“&”上失败:
select cast('<name>Spolsky & Atwood</name>' as xml)
有谁知道解决方法?
更长的解释,我需要更新 XML 列中的一些数据,并且我通过将 XML 值转换为 varchar 来使用搜索和替换类型 hack,使用此转换执行替换和更新 XML 列。
SQL Server 2005 上的以下代码片段在与号“&”上失败:
select cast('<name>Spolsky & Atwood</name>' as xml)
有谁知道解决方法?
更长的解释,我需要更新 XML 列中的一些数据,并且我通过将 XML 值转换为 varchar 来使用搜索和替换类型 hack,使用此转换执行替换和更新 XML 列。
它不是有效的 XML。使用&
:
select cast('<name>Spolsky & Atwood</name>' as xml)
select cast('<name>Spolsky & 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 & Atwood</name>
</MyData>
, 用一个&
代替&
.
您还需要对文本进行 XML 转义。
因此,让我们回溯并假设您正在将该字符串构建为:
SELECT '<name>' + MyColumn + '</name>' FROM MyTable
你想做更多类似的事情:
SELECT '<name>' + REPLACE( MyColumn, '&', '&' ) + '</name>' FROM MyTable
当然,您可能应该满足其他实体的需求:
SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&' ), '''', ''' ), '"', '"' ), '<', '<' ), '>', '>' ) + '</name>' FROM MyTable
在 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
正如 John 和 Quassnoi 所说,&
它本身是无效的。这是因为 & 字符是字符实体的开始 - 用于指定无法按字面表示的字符。有两种形式的实体 - 一种通过名称指定字符(例如,&
或"
),另一种通过代码指定字符(我相信它是 Unicode 字符集中的代码位置,但不确定。例如,"
应该表示双引号)。
因此,要在 HTML 文档中包含文字&
,您必须指定它的实体:&
。您可能会遇到的其他常见问题是<
for <
、>
for>
和"
for "
。