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

Похоже, ты забыл очистить печенье. Попробуйте почистить его следующим способом. Windows.UI.Xaml.Controls.WebView.ClearTemporaryWebDataAsync (); Также проверьте ответ stackoverflow Очистить все куки из WebView

440
задан 26.01.2020, 15:38

4 ответа

Вот рабочая версия. Я изменил маркировки 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>
335
ответ дан 26.01.2020, 15:40
  • 1
    XHTML совместимые страницы, как предполагается, правильно построены по определению. Правильно построенные страницы XHTML были предназначены для создания стандартных программ парсинга в веб-браузерах менее сложными. Однако HTML и HTML5 не должны быть правильно построены, хотя они могут быть при желании. Конечно, четные страницы с XHTML DOCTYPE не могли бы быть правильно построены из-за неаккуратных кодеров, таким образом, это, вероятно, почему спецификация HTML5 рекомендуется вместо XHTML5, так как хорошие браузеры, вероятно, поддерживают рендеринг плохо кодированных страниц так или иначе. – Kmeixner 04.01.2013, 22:15
  • 2
    Эти [Serializable] избыточно при использовании XmlSerializer; XmlSerializer просто никогда проверки на это. Аналогично, большая часть [Xml...] атрибуты избыточны, поскольку это просто подражает поведению по умолчанию; т.е. по умолчанию свойство, названное StockNumber, хранится как элемент, названный <StockNumber> - никакая потребность в атрибутах для этого. – Marc Gravell♦ 26.01.2020, 15: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
ответ дан 26.01.2020, 15:44
  • 1
    @Jonathan, Если Вы не получаете ничего распечатанного к stdout, который, вероятно, означает, что это работало. git add, как много команд Unix, печати ничто на успех. Проверьте git status, чтобы видеть, был ли файл добавлен. – Brian Campbell 25.03.2020, 02:52

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

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
ответ дан 26.01.2020, 15:45

Как насчет Вас просто сохраняют 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
ответ дан 26.01.2020, 15:46
  • 1
    Как добраться до xsd.exe – jwillmer 26.01.2020, 15:46
  • 2
    Потрясающая идея, но couldn' t заставляют его работать правильно для моей немного более сложной модели с пакетами вложенных массивов. Я продолжал добираться, ошибки преобразования типов для вложенных массивов - плюс сгенерированная схема именования оставляли желать лучшего. Поэтому я закончил тем, что шел пользовательским путем. – GotDibbs 26.01.2020, 15:47
  • 3
    ВЫ... - человек! Спасибо. для любого, которому нужен он, " path" может быть Поток, как который Вы создаете из веб-ответа так: var resp = ответ. Содержание. ReadAsByteArrayAsync (); поток var = новый MemoryStream (resp. Результат); – Induster 26.01.2020, 15:48
  • 4
    Кроме того, я действительно время от времени использую gitx. – Jonathan Dumaine 25.03.2020, 02:54

Теги

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