2015-08-11 5 views
7

Я пытаюсь десериализовать некоторый XML, и я не могу получить пространство имен/xsi:type="Model" для работы. Если xsi:type="Model" не используется, он работает, но он должен быть там. Если я покину пространство имен из моей модели, я получаю сообщение об ошибке, если я его переименую, я получаю пустой список.Deserializing xml, включая пространство имен

XML-

<Vehicles xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Vehicle xsi:type="Model"> 
     <Id>238614402</Id> 
    </Vehicle> 
    <Vehicle xsi:type="Model"> 
     <Id>238614805</Id> 
    </Vehicle> 
</Vehicles> 

Модель

[XmlRootAttribute("Vehicles")] 
public class Vehicles 
{ 
    public Vehicles() 
    { 
     Vehicle = new List<Vehicle>(); 
    } 

    [XmlElement(ElementName = "Vehicle", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
    public List<Vehicle> Vehicle { get; set; } 
} 


public class Vehicle 
{ 
    [XmlElement("Id")] 
    public int Id { get; set; } 

} 

десериализации

XmlSerializer serializer = new XmlSerializer(typeof(Vehicles)); 
string carXML = "<Vehicles xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Vehicle xsi:type=\"Model\"> <Id>238614402</Id> </Vehicle><Vehicle xsi:type=\"Model\"> <Id>238614805</Id> </Vehicle></Vehicles>"; 

var cars = (Vehicles)serializer.Deserialize(new StringReader(carXML)); 

В приведенном выше примере возвращает прерывать обслуживание y, потому что пространство имен ошибочно, насколько я знаю - как мне получить его, чтобы вернуть фактический список?

EDIT У меня нет никакого контроля над XML, я получаю, что от другого провайдера, так что я должен изменить остальную часть кода соответственно.

+2

«но он должен быть там» - нет, это не так. Пространство имен элемента 'Vehicle' в вашем примере не является' http: // www.w3.org/2001/XMLSchema-instance' - это пространство имен в элементе 'Vehicles' вашего xml было связано с 'xsd' префикс пространства имен - но такой префикс не применяется к элементам« Vehicle »внутри. Следовательно, он находится в глобальном пространстве имен. –

+0

Спасибо за ответ, если я покину пространство имен из моей модели, я получаю следующую ошибку: Указанный тип не был распознан: name = 'Model', namespace = '', at , [InvalidOperationException: указанный тип не был распознан: name = 'Model', namespace = '', at .] – forte

ответ

5

Пожалуйста, попробуйте следующее:

public partial class Vehicles 
{ 
    [XmlElement("Vehicle")] 
    public Vehicle[] Vehicle { get; set; } 
} 

[XmlInclude(typeof(Model))] 
public partial class Vehicle 
{ 
    public uint Id { get; set; } 
} 

public class Model : Vehicle { } 

Обратите внимание на тип vehicle.

var xs = new XmlSerializer(typeof(Vehicles)); 
Vehicles vehicles; 

using (var fs = new FileStream("file.xml", FileMode.Open)) 
{ 
    vehicles = (Vehicles)xs.Deserialize(fs); 
} 

foreach (var vehicle in vehicles.Vehicle) 
{ 
    Console.WriteLine(vehicle.GetType()); // Model 
    Console.WriteLine(vehicle.Id); 
} 

Не нужно указывать пространство имен. При сериализации атрибута xsi будет добавлен автоматически с фактическим типом Model.

xs.Serialize(Console.Out, vehicles); 
+0

Работает как шарм, спасибо! :) – forte

Смежные вопросы