在C#开发中处理XML时,特殊字符是导致解析中断的常见原因。像
、<code>>、
&、
"和
'这些字符在XML中有特定含义,若未正确转义,会直接引发
XmlException。要彻底避免这类问题,关键在于理解何时需要转义以及使用正确的处理方式。
明确哪些字符需要转义
XML规定以下5个字符必须转义:
替换为 <code><
>替换为
>
&替换为
&
"替换为
"
'替换为
'
手动替换不仅容易遗漏,还可能破坏原有内容结构。应优先使用系统提供的API自动处理。
使用XmlWriter安全写入内容
XmlWriter 是最推荐的方式,它会自动处理所有特殊字符转义,无需手动干预。
using (var writer = XmlWriter.Create("data.xml"))
{
writer.WriteStartElement("Message");
writer.WriteString("用户输入包含 <script> 标签和 & 符号");
writer.WriteEndElement();
}
上面代码中,
WriteString方法会自动将
和 <code>&转义,生成合法XML。这是最安全、最简洁的解决方案。
读取时用XmlReader避免注入风险
读取XML时也应使用 XmlReader,它能正确解析转义字符,还原原始内容。
using (var reader = XmlReader.Create("data.xml"))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Text)
{
string text = reader.Value; // 自动解码转义字符
Console.WriteLine(text);
}
}
}
这种方式确保即使内容包含特殊符号,也能完整读取而不中断解析。
处理CDATA段避免转义
如果文本中包含大量特殊字符(如HTML或代码片段),可使用 CDATA 段落,内容不会被解析。
writer.WriteStartElement("Code");
writer.WriteCData("function test() { if (a < b && c > d) ... }");
writer.WriteEndElement();
生成的XML如下:
d) ... }]]>
CDATA内所有字符原样保留,适合存储脚本或配置代码。
基本上就这些。只要坚持使用
XmlWriter和
XmlReader,避免拼接字符串生成XML,就能从根本上杜绝特殊字符引发的解析错误。不复杂但容易忽略。
