2

我一直在 .NET 中对 XML 进行一些测试,发现很多有效的名称字符是不允许的。在几乎所有情况下,我都会在看似有效的字符上收到 XmlException。

XmlException 是从 System.Xml.dll 引发的,带有以下堆栈跟踪:

在 System.Xml.XmlConvert.VerifyNCName(String name, ExceptionType exceptionType) 在 System.Xml.Linq.XName..ctor(XNamespace ns, String localName) 在 System.Xml.Linq.XNamespace.GetName(String localName) 在 System。 Xml.Linq.XName.Get(字符串扩展名)

但是,在名称以“{”字符(十六进制值 0x7B)开头的情况下,我会从 System.Xml.Linq.dll 获得 ArgumentException,并带有以下堆栈跟踪:

在 System.Xml.Linq.XName.Get(字符串扩展名)

奇怪的是,这只适用于“{”是名称中的第一个字符时。如果它稍后出现在名称中,我会得到与所有其他“无效”字符相同的异常和堆栈跟踪。

由于我试图专门捕获这些异常来包装并抛出我自己的异常,所以我希望(我认为是合理的)它们都会抛出相同的异常。

为什么这会引发 ArgumentException 而不是 XmlException?

4

1 回答 1

2

查看MSDNXName.Get文档:

扩展名

类型:System.String包含格式为 的扩展 XML 名称
字符串{namespace}localname

当您以“{”开始字符串参数时,它会以不同的方式处理名称,因为它需要一个命名空间。

这是该方法的来源,通过反射器:

public static XName Get(string expandedName)
{
    if (expandedName == null)
    {
        throw new ArgumentNullException("expandedName");
    }
    if (expandedName.Length == 0)
    {
        throw new ArgumentException(Res.GetString("Argument_InvalidExpandedName",
            new object[] { expandedName }));
    }
    if (expandedName[0] != '{')
    {
        return XNamespace.None.GetName(expandedName);
    }
    int num = expandedName.LastIndexOf('}');
    if ((num <= 1) || (num == (expandedName.Length - 1)))
    {
        throw new ArgumentException(Res.GetString("Argument_InvalidExpandedName",
            new object[] { expandedName }));
    }
    return XNamespace.Get(expandedName, 1, num - 1).GetName(expandedName, num + 1,
        (expandedName.Length - num) - 1);
}
于 2013-01-18T18:50:37.197 回答