Обработка ошибок при разборе XmlDocument

Мне все еще комфортно работать с 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 никогда не редактируются людьми. И по этой причине многие люди могут просто написать код, предполагающий, что ошибок не будет. Если есть ошибка, значит, есть исключение. Я могу понять, что. Но я надеялся дать своему приложению немного больше гибкости, если файлы редактируются людьми и что-то отформатировано неправильно.


person Jonathan Wood    schedule 30.06.2013    source источник
comment
Если вам комфортно с LINQ, я бы предложил перейти на LINQ to XML (хотя у вас все равно будут те же проблемы с отсутствующими элементами / атрибутами или неправильным написанием имен).   -  person Tim    schedule 30.06.2013
comment
Если он не решает эти проблемы, почему вы предлагаете перейти на LINQ to XML?   -  person Jonathan Wood    schedule 30.06.2013
comment
Это намного проще (IMO), тогда использование XmlDocument является основной причиной. Вы можете анализировать, изменять и создавать XML-документы с помощью нескольких строк кода.   -  person Tim    schedule 30.06.2013
comment
Кроме того, и XmlDocument, и XDocument имеют Validate метод, который проверяет документ на соответствие указанной схеме. Это даст вам знать, прежде чем вы начнете работать с ним, есть ли в нем какие-либо ошибки (если у вас есть схема).   -  person Tim    schedule 30.06.2013


Ответы (2)


В зависимости от того, какие ошибки вас интересуют (и как выглядит 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.

person ChaseMedallion    schedule 30.06.2013

На самом деле вы здесь не говорите об «ошибках», вы говорите о вещах, которые могут произойти законно. XML - очень гибкий формат. Одна из проблем заключается в том, что обычные языки программирования гораздо менее гибкие.

Необходимая гибкость встроена в XML-ориентированные языки, такие как XPath, XQuery и XSLT. Низкоуровневое программирование с использованием интерфейсов DOM - действительно тяжелая работа по сравнению с XPath по причинам, которые вы обнаруживаете.

person Michael Kay    schedule 30.06.2013