Десериализация XML-элементов Возвращает NULL - PullRequest
1 голос
/ 11 августа 2011

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

<Stuff>
  <Details>
    <Comment>I want whats in here.</Comment>
    <LogLevel>And here too.</LogLevel>
  </Details>
<Stuff>

Для десериализации я делаю следующее:

XmlSerializer deserializer;
FileStream stream = new FileStream(CONFIG_PATH, FileMode.Open);
XmlReader reader = new XmlTextReader(stream);

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "Stuff";
xRoot.IsNullable = true;

// Details configuration area.
Utilities.Details d = new Utilities.Details();
deserializer = new XmlSerializer((typeof(Details)), xRoot);
d = (Details)deserializer.Deserialize(reader);

System.Windows.MessageBox.Show(d.Comment);

И, наконец, класс, содержащий объекты:

/// <summary>
/// Configuration details.
/// </summary>
[Serializable()]
[XmlRoot(ElementName = "Details", IsNullable = true)]
public sealed class Details
{
    public Details()
    {

    }

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

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

Однако d.Comment и d.LogLevel продолжают возвращать ноль независимо от того, что я делаю. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

С этой настройкой он ожидает

<Stuff>
  <Comment>....
  <LogLevel>...
  ...

Для обработки двух уровней в XML вам понадобится подходящая объектная модель. Вместо того, чтобы связываться с XmlRootAttribute во время выполнения, напишите тип Stuff, у которого есть экземпляр Details в свойстве с именем Details. Затем создайте сериализатор, чтобы ожидать экземпляр Stuff:

public class Stuff {
    public Details Details {get;set;}
}

Альтернативным подходом может быть использование вспомогательного считывателя над входом, но это сложнее.

0 голосов
/ 11 августа 2011

Я столкнулся с множеством подобных проблем, когда пытался использовать XmlSerializer и FileStreams.

Я бы предложил изменить это на Linq на XML. Я обнаружил, что учиться намного легче и быстрее.

Вот отличное видео от Майка Таулти

Учебник по Linq to XML

...