我正在尝试反序列化一些 XML,但无法获取名称空间 /xsi:type="Model"
上班。如果xsi:type="Model"
被排除在 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>
Model
[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));
上面的例子返回一个空列表,因为命名空间是错误的,据我所知 - 如何让它返回一个实际的列表?
EDIT我对 XML 没有任何控制权,我是从不同的提供商那里获得的,所以我必须相应地更改其余的代码。
请尝试这个:
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)