Здравствуйте! Сегодня: Пн, 20 Ноя 2017, Ваш IP: 54.224.121.67 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Программирование для MS Windows
+ Создать новую тему Страница: 1
Тема: XmlReader. Считываение элемнтов через одну. · +  +  дата добавления: 15.01.2017 / 11:10
Автор темы:
sadam.agashirinov
sadam.agashirinov
тем: 1 / ответов: 2 / благодарностей: 0 / репутация: 0
ответов: 2
создал(а) тем: 1


День добрый!
Наткнулся на эту статью на этом же сайте.тыц Статья про то как работать с XmlReader.
В статье есть пример, который я переделал под свои нужды
using (XmlReader xml = XmlReader.Create("XmlFile1.xml"))
{
 while (xml.Read())
 {
 switch (xml.NodeType)
 {
  case XmlNodeType.Element:
  // нашли элемент member
  if (xml.Name == "member")
  {
   // передаем данные в класс Member
   Member m = new Member(xml.ReadOuterXml());
   Console.WriteLine("KUID: {0}", m.KUID);
   Console.WriteLine("Псевдоним: {0}", m.Nickname);
   Console.WriteLine("Имя: {0}", m.FirstName);
   Console.WriteLine("Фамилия: {0}", m.LastName);
   Console.WriteLine("------------------------------------------");
  }
  break;
 }
 }
}

Переделал и получилось так:
using (XmlReader xml = XmlReader.Create("E:\\ESTSTAT.xml"))
            {
                while (xml.Read())
                {
                    if (xml.NodeType == XmlNodeType.Element && xml.Name.Equals("EstateStatus"))
                    {
                        EstateStatus estateStatus = new EstateStatus(xml.ReadOuterXml());
                        Console.WriteLine($"{estateStatus.EststatId} => {estateStatus.Name}");
                    }
                }
            }
Класс EstateStatus.cs имеет следующую структуру
[XmlRoot("EstateStatus")]
    public class EstateStatus
    {
        [XmlAttribute("NAME")]
        public string Name { get; set; }

        [XmlAttribute("ESTSTATID")]
        public int EststatId { get; set; }

        public EstateStatus()
        {

        }

        public EstateStatus(string xml)
        {
            LoadXml(xml);
        }

        private void LoadXml(string source)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(this.GetType());
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(source)))
            {
                object obj = xmlSerializer.Deserialize(stream);

                foreach (PropertyInfo property in obj.GetType().GetProperties())
                {
                    PropertyInfo tmp = this.GetType().GetProperty(property.Name);
                    if (tmp != null && tmp.CanWrite) tmp.SetValue(this, property.GetValue(obj, null), null);
                }
            }
        }
    }

Считывание информации происходит из XML файла следующей структуры
<?xml version="1.0" encoding="UTF-8"?>
<EstateStatuses>
<EstateStatus NAME="Не определено" ESTSTATID="0"/>
<EstateStatus NAME="Владение" ESTSTATID="1"/>
<EstateStatus NAME="Дом" ESTSTATID="2"/>
<EstateStatus NAME="Домовладение" ESTSTATID="3"/>
<EstateStatus NAME="Гараж" ESTSTATID="4"/>
</EstateStatuses>
XML файл взят для примера. Предполагается чтение XML файла где узлы имеют только атрибуты, количество которых может быть до 20 атрибутов. А размер XML файла может достигать от нескольких килобайт до гигабайта


На выходе получаю следующие данные

0 => Не определено
2 => Дом
4 => Гараж

То есть считывание из XML файла происходит через элемент.
Вопрос в том, почему так происходит и как это исправить?

Спасибо!
Технологии: .NET Framework, C#, XML (eXtensible Markup Language)
 
Ответ # 1 # · +  +  дата добавления: 15.01.2017 / 11:12
Автор ответа:
sadam.agashirinov
sadam.agashirinov
тем: 1 / ответов: 2 / благодарностей: 0 / репутация: 0
ответов: 2
создал(а) тем: 1


Пробовал так тоже
 using (XmlReader xml = XmlReader.Create("E:\\ESTSTAT.xml"))
            {
                while (xml.Read())
                {
                    if (xml.NodeType == XmlNodeType.Element && xml.Name.Equals("EstateStatus"))
                    {
                        XmlDocument xmlDocument = new XmlDocument();
                        xmlDocument.LoadXml(xml.ReadOuterXml());
                        XmlNode node = xmlDocument.SelectSingleNode("EstateStatus");
                        Console.WriteLine($"{node.Attributes["ESTSTATID"].Value} => {node.Attributes["NAME"].Value}");
                    }
                }
            }

Результат аналогичный
 
Ответ # 2 # · +  +  дата добавления: 15.01.2017 / 11:45
Автор ответа:
sadam.agashirinov
sadam.agashirinov
тем: 1 / ответов: 2 / благодарностей: 0 / репутация: 0
ответов: 2
создал(а) тем: 1


Изменил структуру XML файла следующим образом
<?xml version="1.0" encoding="UTF-8"?>
<Estate>
<EstateStatuses>
<EstateStatus NAME="Не определено" ESTSTATID="0"/>
<EstateStatus NAME="Владение" ESTSTATID="1"/>
<EstateStatus NAME="Дом" ESTSTATID="2"/>
<EstateStatus NAME="Домовладение" ESTSTATID="3"/>
<EstateStatus NAME="Гараж" ESTSTATID="4"/>
</EstateStatuses>
</Estate>

То есть в начале и в конце добавил тег <Estate> и файл ста считываться правильно. Но это частичное решение данного вопроса. Так перед считыванием файла надо добавить в начале и в конце тег.

Нужно найти решение именно для случая когда XML файл имеет такой формат как описано в первом посте
 
Ответ # 3 # · +  +  дата добавления: 06.02.2017 / 13:11
Автор ответа:
lenivo
lenivo
тем: 0 / ответов: 1 / благодарностей: 0 / репутация: 0
ответов: 1
создал(а) тем: 0


Https://msdn.microsoft.com/ru-ru/library/system.xml.xmlreader.readouterxml(v=vs.110).aspx
"Если модуль чтения располагается в конечном узле, вызов метода ReadOuterXml будет равносилен вызову метода Read."
Поэтому у Вас дважды Read за один цикл.
 
Страница: 1 + Создать новую тему