【问题标题】:Why does XName.Get throw an ArgumentException instead of an XmlException for names starting with '{'?为什么 XName.Get 会为以“{”开头的名称抛出 ArgumentException 而不是 XmlException?
【发布时间】:2013-01-02 13:09:42
【问题描述】:

我一直在 .NET 中对 XML 进行一些测试,发现 a lot of valid name characters are not allowed。在几乎所有情况下,我都会在看似有效的字符上收到 XmlException。

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

在 System.Xml.XmlConvert.VerifyNCName(字符串名称,ExceptionType 异常类型) 在 System.Xml.Linq.XName..ctor(XNamespace ns,字符串 localName) 在 System.Xml.Linq.XNamespace.GetName(字符串 localName) 在 System.Xml.Linq.XName.Get(字符串扩展名称)

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

在 System.Xml.Linq.XName.Get(String expandName)

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

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

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

【问题讨论】:

    标签: c# xml linq-to-xml argumentexception xmlexception


    【解决方案1】:

    查看MSDN documentation 以获得XName.Get

    扩展名

    输入:System.String
    一个String,包含格式为{namespace}localname 的扩展XML 名称。

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

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

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2019-08-03
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      相关资源
      最近更新 更多