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

解析エラーの処理は、明らかにより困難です。1 つの方法は、上記のように XmlSerializer を使用し、すべての型に文字列を使用することです (おそらく、不適切な書式設定の処理を組み込んだラッパー プロパティを使用します)。型の安全性を高めるために、IXmlSerializable を「安全に」実装し、System 型への暗黙的な変換を定義するカスタム型を定義できます。

于 2013-06-30T18:37:25.590 に答える