Как я могу десериализовать этот документ XML:
<?xml version="1.0" encoding="utf-8"?>
<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>
У меня есть это:
[Serializable()]
public class Car
{
[System.Xml.Serialization.XmlElementAttribute("StockNumber")]
public string StockNumber{ get; set; }
[System.Xml.Serialization.XmlElementAttribute("Make")]
public string Make{ get; set; }
[System.Xml.Serialization.XmlElementAttribute("Model")]
public string Model{ get; set; }
}
,
[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
[XmlArrayItem(typeof(Car))]
public Car[] Car { get; set; }
}
,
public class CarSerializer
{
public Cars Deserialize()
{
Cars[] cars = null;
string path = HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data/") + "cars.xml";
XmlSerializer serializer = new XmlSerializer(typeof(Cars[]));
StreamReader reader = new StreamReader(path);
reader.ReadToEnd();
cars = (Cars[])serializer.Deserialize(reader);
reader.Close();
return cars;
}
}
это не похоже на работу :-(
Ответы:
Вот рабочая версия. Я изменил
XmlElementAttribute
метки на,XmlElement
потому что в xml значения StockNumber, Make и Model являются элементами, а не атрибутами. Также я удалилreader.ReadToEnd();
(эта функция читает весь поток и возвращает строку, поэтомуDeserialize()
функция больше не могла использовать считыватель ... позиция была в конце потока). Я также взял несколько вольностей с именами :).Вот классы:
Функция десериализации:
И слегка подправленный xml (мне нужно было добавить новый элемент для переноса <Cars> ... Net требовательна к десериализации массивов):
источник
[Serializable]
избыточно при использованииXmlSerializer
;XmlSerializer
просто никогда не проверяет это. Аналогично, большинство[Xml...]
атрибутов являются избыточными, поскольку они просто имитируют поведение по умолчанию; то есть по умолчанию свойство с именемStockNumber
сохраняется как элемент с именем<StockNumber>
- для этого не нужны атрибуты.Как насчет того, чтобы просто сохранить XML в файл и использовать xsd для генерации классов C #?
xsd foo.xml
xsd foo.xsd /classes
Et voila - и файл кода C #, который должен быть в состоянии прочитать данные через
XmlSerializer
:(включите сгенерированный foo.cs в проект)
источник
У вас есть две возможности.
Способ 1. XSD- инструмент
Предположим, что у вас есть файл XML в этом месте
C:\path\to\xml\file.xml
Вы можете найти ее в.
Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools
Или, если у вас Windows 8, просто начните вводить Командную строку разработчика на начальном экране.cd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
И это все! Вы создали классы C # из XML-файла в
C:\path\to\xml\file.cs
Метод 2 - Специальная вставка
Требуется Visual Studio 2012+
Edit > Paste special > Paste XML As Classes
И это все!
Применение
Использование этого вспомогательного класса очень просто:
Все, что вам нужно сделать сейчас, это:
источник
Paste XML As Classes
команда нацелена только на .NET 4.5Следующий фрагмент должен помочь (и вы можете игнорировать большинство атрибутов сериализации):
...
источник
Посмотрите, поможет ли это:
,
В противном случае используйте программу xsd.exe, поставляемую с Visual Studio, для создания документа схемы на основе этого XML-файла, а затем снова используйте его для создания класса на основе документа схемы.
источник
Я не думаю, что .net «требователен к десериализации массивов». Первый документ XML не очень хорошо сформирован. Корневого элемента нет, хотя, похоже, он есть. Канонический XML-документ имеет корень и как минимум 1 элемент (если есть). В вашем примере:
источник
попробуйте этот блок кода, если ваш XML-файл был сгенерирован где-то на диске и если вы использовали
List<T>
:Примечание:
C:\serialize.xml
путь моего файла .xml. Вы можете изменить его для своих нужд.источник
Аноним Кевина хорош, если не считать того факта, что в реальном мире вы часто не можете изменить исходный XML в соответствии с вашими потребностями.
Существует также простое решение для оригинального XML:
И тогда вы можете просто позвонить:
источник
Попробуйте этот общий класс для сериализации и десериализации Xml.
источник
Для начинающих
Я нашел ответы здесь очень полезными, и сказал, что я все еще изо всех сил пытался заставить это работать. Так что, если кому-то это поможет, я напишу рабочее решение:
XML из оригинального вопроса. XML-файл находится в файле Class1.xml,
path
этот код используется в коде для поиска этого XML-файла.Я использовал ответ @erymski, чтобы это заработало, поэтому создал файл с именем Car.cs и добавил следующее:
Другая часть кода предоставлена @erymski ...
... входит в вашу основную программу (Program.cs)
static CarCollection XCar()
примерно так:Надеюсь, поможет :-)
источник
Как насчет универсального класса для десериализации XML-документа
Эта часть может или не может быть необходимой. Откройте документ XML в Visual Studio, щелкните правой кнопкой мыши на XML, выберите свойства. Затем выберите файл схемы.
источник
Один лайнер:
источник
Идея состоит в том, чтобы весь уровень обрабатывался для десериализации. Пожалуйста, посмотрите пример решения, которое решило мою похожую проблему.
Приведенный выше XML обрабатывается в два уровня
Внутренний уровень
Таким же образом, вам нужно многоуровневое с
car as array
Проверьте этот пример для многоуровневой десериализацииисточник
Если вы получаете ошибки при использовании xsd.exe для создания файла xsd, используйте класс XmlSchemaInference, как указано в msdn . Вот тестовый модуль для демонстрации:
источник
Вы можете просто изменить один атрибут для вашего автомобиля Cars с XmlArrayItem на XmlElment. То есть из
в
источник
Мое решение:
Edit > Past Special > Paste XML As Classes
чтобы получить класс в вашем кодеList<class1
>), а затем используйтеXmlSerializer
для сериализации этого списка вxml
файл.deserialize
это.Код:
ПРИМЕЧАНИЕ: вы должны обратить внимание на корневое имя, не меняйте его. Шахта "ArrayOfClass1"
источник
источник