如果在XElement
的内容中包含字符'\x1A'、'\x1B'、'\x1C'、'\x1D'、'\x1E'或'\x1F',会导致异常。
using System;
using System.Collections.Generic;
using System.Xml.Linq;
namespace LINQtoXMLInvalidChars
{
class Program
{
private static readonly IReadOnlyCollection<char> InvalidCharactersInXml = new List<char>
{
'<',
'>',
'&',
'\'',
'\"',
'\x1A',
'\x1B',
'\x1C',
'\x1D',
'\x1E',
'\x1F'
};
static void Main()
{
foreach (var c in InvalidCharactersInXml)
{
var xEl = new XElement("tag", "Character: " + c);
var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", null), xEl);
try
{
Console.Write("Writing " + c + ": ");
Console.WriteLine(xDoc);
}
catch (Exception e)
{
Console.WriteLine("Oops. " + e.Message);
}
}
Console.ReadKey();
}
}
}
在Jon Skeet的回答《将字符串转义为XML》这个问题中,他说:
你设置节点中的文本,它会自动转义需要转义的任何内容。
所以我现在很困惑。我是否理解错了什么?
一些背景信息:XElement
的字符串内容来自最终用户。我看到两个选项可以使我的应用程序更加健壮:1)在传递给XElement
之前对字符串进行Base-64编码;2)将接受的字符集范围缩小到例如字母数字字符。