Как десериализовать XML-документ

Существует прецедент для возврата структур в стандарте C (и, следовательно, C ++) с функциями div, ldiv (и в C99, lldiv) из <stdlib.h> (или <cstdlib>).

«Смешение возвращаемого значения и возвращаемых параметров» обычно является наименее чистым.

Наличие функции возвращает статус и возвращает данные через возвращаемые параметры в C; это менее очевидно в C ++, где вы могли бы использовать исключения для ретрансляции информации об отказах.

Если имеется более двух возвращаемых значений, то, вероятно, лучше всего подходит структура-подобный механизм.

434
задан Dariusz Woźniak 9 August 2012 в 19:40
поделиться

5 ответов

Вот рабочая версия. Я изменил маркировки XmlElementAttribute на XmlElement, потому что в xml StockNumber, Сделайте, и Образцовые значения являются элементами, не атрибутами. Также я удалил читателя. ReadToEnd (); (что функция чтения целый поток и возвраты строка, таким образом, Deserialze () функция не могла использовать читателя больше... положение, была в конце потока). Я также взял несколько свобод с именованием:).

Вот классы:

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement("StockNumber")]
    public string StockNumber { get; set; }

    [System.Xml.Serialization.XmlElement("Make")]
    public string Make { get; set; }

    [System.Xml.Serialization.XmlElement("Model")]
    public string Model { get; set; }
}


[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
    [XmlArray("Cars")]
    [XmlArrayItem("Car", typeof(Car))]
    public Car[] Car { get; set; }
}

Десериализовывать функция:

CarCollection cars = null;
string path = "cars.xml";

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));

StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();

И немного настроенный xml (я должен был добавить новый элемент для обертывания < Cars>... сеть требовательна в отношении десериализации массивов):

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Nissan</Make>
    <Model>Sentra</Model>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
  <Car>
    <StockNumber>1111</StockNumber>
    <Make>Honda</Make>
    <Model>Accord</Model>
  </Car>
</Cars>
</CarCollection>
332
ответ дан Kevin Tighe 9 August 2012 в 19:40
поделиться

Посмотрите, помогает ли это:

[Serializable()]
[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
    [XmlArrayItem(typeof(Car))]
    public Car[] Car { get; set; }
}

.

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement()]
    public string StockNumber{ get; set; }

    [System.Xml.Serialization.XmlElement()]
    public string Make{ get; set; }

    [System.Xml.Serialization.XmlElement()]
    public string Model{ get; set; }
}

И сбой, которые используют программу xsd.exe, которая идет с Visual Studio, чтобы создать документ схемы на основе этого xml файл, и затем использовать его снова для создания класса на основе документа схемы.

22
ответ дан Joel Coehoorn 9 August 2012 в 19:40
поделиться

Следующий отрывок должен добиться цели (и можно проигнорировать большинство атрибутов сериализации):

public class Car
{
  public string StockNumber { get; set; }
  public string Make { get; set; }
  public string Model { get; set; }
}

[XmlRootAttribute("Cars")]
public class CarCollection
{
  [XmlElement("Car")]
  public Car[] Cars { get; set; }
}

...

using (TextReader reader = new StreamReader(path))
{
  XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
  return (CarCollection) serializer.Deserialize(reader);
}
82
ответ дан 9 August 2012 в 19:40
поделиться

Как насчет Вас просто сохраняют xml в файл и используют xsd для генерации классов C#?

  1. Запись файл к диску (я назвал его foo.xml)
  2. Генерируют xsd: xsd foo.xml
  3. Генерируют C#: xsd foo.xsd /classes

И вуаля - и файл кода C#, который должен быть в состоянии считать данные через XmlSerializer:

    XmlSerializer ser = new XmlSerializer(typeof(Cars));
    Cars cars;
    using (XmlReader reader = XmlReader.Create(path))
    {
        cars = (Cars) ser.Deserialize(reader);
    }

(включают сгенерированный foo.cs в проект)

421
ответ дан DaveInCaz 9 August 2012 в 19:40
поделиться

Один лайнер:

var object = (Cars)new XmlSerializer(typeof(Cars)).Deserialize(new StringReader(xmlString));
1
ответ дан 22 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

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