1

我仍然习惯于使用 XML 文件。我一直在网上查看一些示例,并且对缺乏错误处理感到震惊。

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

所以我开始按照以下思路编写一些辅助扩展方法:

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 文件从未被人类编辑过。而且,出于这个原因,许多人可能只是编写假设不会有错误的代码。如果有错误,那么就有异常。我可以理解。但如果文件是由人类编辑的,我希望给我的应用程序更多的灵活性,并且某些内容的格式不正确。

4

2 回答 2

1

根据您有兴趣处理的错误(以及您正在解析的 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 并定义到 System 类型的隐式转换的自定义类型。

于 2013-06-30T18:37:25.590 回答
0

您在这里并不是真的在谈论“错误”,而是在谈论可以合法发生的事情。XML 是一种非常灵活的格式。问题之一是传统的编程语言远没有那么灵活。

您正在寻找的那种灵活性内置于面向 XML 的语言中,例如 XPath、XQuery 和 XSLT。由于您正在发现的原因,与 XPath 相比,针对 DOM 接口的低级编程确实是一项艰巨的工作。

于 2013-06-30T20:21:12.367 回答