SQL Server 2005上的以下代码段在&符号'&'上失败:
select cast('<name>Spolsky & Atwood</name>' as xml)
有没有人知道解决方法?
更长的解释,我需要更新XML列中的一些数据,并且我正在使用搜索&amp;通过将XML值转换为varchar来替换类型hack,使用此强制转换替换和更新XML列。
答案 0 :(得分:6)
它不是有效的XML。使用&
:
select cast('<name>Spolsky & Atwood</name>' as xml)
答案 1 :(得分:5)
select cast('<name>Spolsky & Atwood</name>' as xml)
XML
标准不允许XML
标记内的文字&符号,并且任何XML
解析器都无法解析此类文档。
XMLSerializer()
会输出&号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>
,&
代替&
。
答案 2 :(得分:3)
你也需要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
答案 3 :(得分: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
答案 4 :(得分:0)
正如John和Quassnoi所说,&
对它本身无效。这是因为&符号是字符实体的开头 - 用于指定无法按字面表示的字符。有两种形式的实体 - 一种是按名称指定字符(例如,&
或"
),另一种是通过它的代码指定字符(我相信它是Unicode字符中的代码位置)设置,但不确定。例如,"
应代表双引号。)
因此,要在HTML文档中包含文字&
,您必须指定它的实体:&
。您可能遇到的其他常见问题包括:<
为<
,>
为>
,"
为"
。