分析XmlDocument时处理错误

本文关键字:错误 处理 XmlDocument 分析 | 更新日期: 2023-09-27 18:20:32

我在处理XML文件时仍然感到很舒服。我在网上看了很多例子,并对缺乏错误处理感到震惊。

最常见的错误是类似el.Attributes["name"].Value的错误。由于XML是可人工编辑的,因此可能缺少该属性。尝试引用null上的Value属性将引发异常。其他问题将与数据不符合预期格式有关。

因此,我开始按照以下内容编写一些辅助扩展方法:

public static class XmlHelpers
{
    public static string GetValue(this XmlAttribute attr, string defaultValue = "")
    {
        if (attr != null)
            return attr.Value;
        return defaultValue;
    }
    public static bool GetValueBool(this XmlAttribute attr, bool defaultValue = false)
    {
        bool value;
        if (bool.TryParse(attr.GetValue(), out value))
            return value;
        return defaultValue;
    }
}

我知道这会奏效的。但我错过了什么吗?XmlDocument是否已经提供了使这种类型的东西变得不必要的功能?我只是想知道其他人是怎么处理的。

我意识到许多XML文件从未被人类编辑过。出于这个原因,许多人可能只是编写假设不会出现错误的代码。如果出现错误,则会出现异常。我能理解。但我希望,如果文件是由人类编辑的,并且某些文件的格式不太正确,我的应用程序会有更大的灵活性

分析XmlDocument时处理错误

根据您感兴趣的错误(以及您正在解析的XML的外观),XmlSerializer类可能会有用:

void Main()
{
    var xmlSerializer = new XmlSerializer(typeof(Foo));
    var foo1 = (Foo)xmlSerializer.Deserialize(new StringReader(@"<Foo a=""11""></Foo>"));
    Console.WriteLine(foo1.A); // 11
    var foo2 = (Foo)xmlSerializer.Deserialize(new StringReader(@"<Foo></Foo>"));
    Console.WriteLine(foo2.A); // 10 (fell back to the default)
    // throws format exception
    var foo3 = (Foo)xmlSerializer.Deserialize(new StringReader(@"<Foo a=""x""></Foo>"));
}
// Define other methods and classes here
[XmlRoot("Foo")]
public class Foo {
    public Foo() { this.A = 10; }
    [XmlAttribute("a")]
    public int A { get; set; }
}

处理解析错误显然更加困难。一种方法是如上所述使用XmlSerializer,但对所有类型都使用字符串(可能具有包含错误格式处理的包装器属性)。为了获得更多的类型安全性,您可以定义自定义类型,这些类型"安全"地实现IXmlSerializable,并定义到系统类型的隐式转换。

这里并不是在谈论"错误",而是在谈论可以合法发生的事情。XML是一种非常灵活的格式。其中一个问题是传统编程语言的灵活性要低得多。

您正在寻找的那种灵活性内置于面向XML的语言中,如XPath、XQuery和XSLT。与XPath相比,针对DOM接口的低级别编程确实很难,原因如下。