Чтение XML в C#


Это кажется слишком много вложенности:

using (XmlReader reader = XmlReader.Create(filename))
{
    while (reader.Read())
    {
        if (reader.IsStartElement())
        {
            switch (reader.Name)
            {
                case "Width":
                    map.Width = ParseXMLValue(reader);
                    break;
                case "Height":
                    map.Height = ParseXMLValue(reader);
                    break;
                case "TileSize":
                    map.TileSize = ParseXMLValue(reader);
                    break;
                case "Layers":
                    map.LayerCount = ParseXMLValue(reader);
                    break;
                case "Layout":
                    ParseLayout(reader);
                    break;
                case "Layer":
                    currentLayerIndex = ParseLayer(reader);
                    break;
                case "CollisionLayer":
                    currentLayerIndex = ParseCollisionLayer();
                    break;
                case "Row":
                    ParseRow(reader);
                    break;
            }
        }
    }
}

Это ПarseXMLValue(читатель):

private int ParseXMLValue(XmlReader reader)
{
    reader.Read();

    return int.Parse(reader.Value);
}

Я новичок в чтении XML в C#. Безусловно, есть лучший способ?



9320
3
задан 23 августа 2011 в 10:08 Источник Поделиться
Комментарии
2 ответа

Да, много. XDocument используется самый простой вариант. Хотя он не выполняет также, если ваши документы имеют значительные размеры или исполнение совершенно необходимо:
http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html

Это работает так:

XDocument someXmlDoc = XDocument.Create(fileName);
IEnumerable<XElement> widthElements = someXmlDoc.Descendants("Width");
int[] widthValues = widthElements.Select(xelement => int.Parse(xelement.Value)).ToArray();

Хотя я не понимаю логики в вашем фрагменте, как вы сидите элементов одного члена неоднократно, поэтому я не собираюсь резерва дает более совершенным использования, которые могут соответствовать свои функции лучше, хотя я бы посоветовал читать в MSDN статьи для интерфейса IEnumerable.Выберите() и IEnumerable.Где (), чтобы получить представление, как использовать его для ваших конкретных целей.

Выберите: http://msdn.microsoft.com/en-us/library/bb548891.aspx

Где: http://msdn.microsoft.com/en-us/library/bb534803.aspx

5
ответ дан 23 августа 2011 в 10:08 Источник Поделиться

Я всегда предпочитаю работать с объектами поко вместо XML-документов. Если я правильно понял, вы просто хотите, чтобы файл XML в набор объектов.

Для этого вам нужно:


  1. Определить объекты модели - это просто создать набор классов, которые вы хотите получить после десериализации. Там должен быть корневой класс, который стоит на корневого элемента XML.

  2. Поставить правильные атрибуты свойств классов. Вот как вы будете связывать свойства с XML-элементов/атрибутов

  3. Использовать XmlSerializer для десериализации файла в нормальные классы Poco.

Увидеть хорошее объяснение здесь - http://www.agiledeveloper.com/articles/XMLSerialization.pdf

0
ответ дан 24 августа 2011 в 05:08 Источник Поделиться