Задать вопрос

Как десериализовать xml с последующим заполнением textbox?

Есть xml файл:

<?xml version="1.0" encoding="utf-8"?>
<users>
  <radiostation name="radiostation1">
    <country>1</country>
    <genre>2</genre>
    <subgenre />
    <title>3</title>
    <urlwww>https://</urlwww>
    <ico />
  </radiostation>
<users>


Сделал поля для сериализации:

[Serializable]
[XmlRoot(ElementName = "users", Namespace = "")]
public class Test
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("country")]
    public string Country { get; set; }

    [XmlElement("genre")]
    public string Genre { get; set; }

    [XmlElement("subgenre")]
    public string Subgenre { get; set; }

    [XmlElement("title")]
    public string Title { get; set; }

    [XmlElement("urlwww")]
    public string Urlwww { get; set; }

    [XmlElement("ico")]
    public string Ico { get; set; }
}


Метод:

private T LoadFile<T>(string filePath)
        {
            using (var fileStream = new FileStream(XMLFileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(fileStream);
            }
        }


Пытаюсь заполнить данные - поля textbox, но в них не появляется информация, что я делаю не так?

var xmlTests = LoadFile<Test>(XMLFileName);

           if (xmlTests.Title == MainForm.nameStation)
          {
                editTitleRadiostation.Text = xmlTests.Name;
                editCountryPanel.Text = xmlTests.Country;
                editGenrePanel.Text = xmlTests.Genre;
                editSubGenrePanel.Text = xmlTests.Subgenre;
                editUrlPanel.Text = xmlTests.Urlwww;
                editIcoPanel.Text = xmlTests.Ico;
         }
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
FoggyFinder
@FoggyFinder
У вас xml не соответствует классу.

0) Нет закрывающего тега (полагаю, это опечатка)
1) В xml описывает вложенный элемент radiostation тогда как в классах этого типа нет
2) name это аттрибут, а вы пытаетесь десериализовать как элемент.

В таких случаях проще не писать классы самому а использовать сервисы, такие как Xml2Csharp

Вставляем xml, получаем

[XmlRoot(ElementName = "radiostation")]
public class Radiostation
{
    [XmlElement(ElementName = "country")]
    public string Country { get; set; }
    [XmlElement(ElementName = "genre")]
    public string Genre { get; set; }
    [XmlElement(ElementName = "subgenre")]
    public string Subgenre { get; set; }
    [XmlElement(ElementName = "title")]
    public string Title { get; set; }
    [XmlElement(ElementName = "urlwww")]
    public string Urlwww { get; set; }
    [XmlElement(ElementName = "ico")]
    public string Ico { get; set; }
    [XmlAttribute(AttributeName = "name")]
    public string Name { get; set; }
}

[XmlRoot(ElementName = "users")]
public class Users
{
    [XmlElement(ElementName = "radiostation")]
    public Radiostation Radiostation { get; set; }
}


Ответ написан на предположении что менять структуру классов допустимо, если это не так то уточните этот момент в комментариях.

Также небольшое замечание относительно метода LoadFile: вы в нем совсем не используете параметр filePath
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@mkvmaks Автор вопроса
Добрый вечер. По 1-у - да ошибка.
Переделал все как вы описали:

[Serializable]
    [XmlRoot(ElementName = "radiostation")]
    public class Radiostation
    {
        [XmlElement(ElementName = "country")]
        public string Country { get; set; }
        [XmlElement(ElementName = "genre")]
        public string Genre { get; set; }
        [XmlElement(ElementName = "subgenre")]
        public string Subgenre { get; set; }
        [XmlElement(ElementName = "title")]
        public string Title { get; set; }
        [XmlElement(ElementName = "urlwww")]
        public string Urlwww { get; set; }
        [XmlElement(ElementName = "ico")]
        public string Ico { get; set; }
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
    }

    [Serializable]
    [XmlRoot(ElementName = "users")]
    public class Members
    {
        [XmlElement(ElementName = "radiostation")]
        public Radiostation Radiostation { get; set; }
    }


пытаюсь считать так:

var fileStream = new FileStream(XMLFileName, FileMode.Open);
            XmlSerializer serializer = new XmlSerializer(typeof(Radiostation));
            var _nds = (Radiostation)serializer.Deserialize(fileStream);

                editTitleRadiostation.Text = _nds.Name;
                editCountryPanel.Text = _nds.Country;
                editGenrePanel.Text = _nds.Genre;
                editSubGenrePanel.Text = _nds.Subgenre;
                editUrlPanel.Text = _nds.Urlwww;
                editIcoPanel.Text = _nds.Ico;


Получаю ошибку : в документе XML(2,2) присутствует ошибка. Ругается на
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы