2

.NET で XML のテストを行ったところ、多くの有効な名前文字が許可されていないことがわかりました。ほとんどの場合、一見有効な文字に対して XmlException が発生します。

System.Xml.dll から XmlException がスローされ、次のスタック トレースが表示されます。

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(文字列の拡張名)

ただし、名前が「{」文字 (16 進値 0x7B) で始まる場合、代わりに System.Xml.Linq.dll から ArgumentException が発生し、次のスタック トレースが表示されます。

System.Xml.Linq.XName.Get (文字列のexpandedName) で

奇妙なことに、これは "{" が名前の最初の文字である場合にのみ適用されます。名前の後ろにある場合は、他のすべての「無効な」文字と同じ例外とスタック トレースが表示されます。

私はこれらの例外を具体的にキャッチしてラップして独自の例外をスローしようとしているので、それらがすべて同じ例外をスローすることを望んでいました (当然のことながら、私はそう思います)。

XmlException ではなく ArgumentException がスローされるのはなぜですか?

4

1 に答える 1

2

については、MSDN のドキュメントを参照してXName.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 に答える