[英]Skipping element when deserializing an XML to list of objects
我有以下XML:
<OUTPUT_XML>
<VehicleMakes>
<VehicleMake VehMakeId="1" MakeName="VOLKSWAGEN" VehTypeId="1"/>
<VehicleMake VehMakeId="2" MakeName="OPEL" VehTypeId="1"/>
<VehicleMake VehMakeId="3" MakeName="FORD" VehTypeId="1"/>
<VehicleMake VehMakeId="4" MakeName="VAZ" VehTypeId="1"/>
<VehicleMake VehMakeId="5" MakeName="FIAT" VehTypeId="1"/>
</VehicleMakes>
</OUTPUT_XML>
我需要將其序列化為一個對象,但是我需要跳過<OUTPUT_XML>
並僅反序列化VehicleMakes。 作為列表。 我在表示OUTPUT_XML的類中使用了XmlArray和XmlArrayItem並起作用,但是如果我嘗試通過編寫以下內容來跳過該類(OUTPUT_XML):
public class GetMakesResponse
{
[XmlElement("exec_id")]
public string ExecId { get; set; }
[XmlElement("ERROR_CODE")]
public int ErrorCode { get; set; }
[XmlElement("VehicleMake")]
public List<VehicleMake> VehicleMakes { get; set; }
}
xml序列化程序失敗,並且集合為空。
謝謝。
加:
目前,我使用以下類:
[Serializable]
[XmlRoot("root")]
public class MakesResponse
{
[XmlElement("exec_id")]
public string ExecId { get; set; }
[XmlElement("ERROR_CODE")]
public int ErrorCode { get; set; }
[XmlElement("OUTPUT_XML")]
public Output Output { get; set; }
}
[Serializable]
public class VehicleMake
{
[XmlAttribute("VehMakeId")]
public int VehMakeId { get; set; }
[XmlAttribute("MakeName")]
public string MakeName { get; set; }
[XmlAttribute("VehTypeId")]
public short VehTypeId { get; set; }
}
[Serializable]
public class Output
{
[XmlArray(ElementName = "VehicleMakes")]
[XmlArrayItem(ElementName = "VehicleMake")]
public List<VehicleMake> VehicleMakes { get; set; }
}
和反序列化的代碼:
public class XmlSerializationUtility<T>
{
private readonly XmlSerializer _serializer;
public XmlSerializationUtility()
{
_serializer = new XmlSerializer(typeof(T));
}
public T Deserialize(string xml)
{
using (var mStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
return (T)_serializer.Deserialize(mStream);
}
}
public string Serialize<TInput>(TInput obj)
{
using (var sw = new StringWriter())
using (var writer = XmlWriter.Create(sw))
{
_serializer.Serialize(writer, obj);
return sw.ToString();
}
}
}
和這工作正常,但我想跳過可能的輸出ID。
您可以使用XmlTextReader
遍歷各個VehicleMake
元素,並分別反序列化它們,如下所示:
XmlSerializer serializer = new XmlSerializer(typeof(VehicleMake));
List<VehicleMake> result = new List<VehicleMake>();
XmlTextReader reader = new XmlTextReader(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
if(reader.ReadToDescendant("VehicleMake"))
{
do
{
result.Add((VehicleMake)serializer.Deserialize(reader));
} while (reader.ReadToNextSibling("VehicleMake"));
}
請注意,您的XML如下所示( ArrayOfVehicleMake
而不是VehicleMakes
):
<OUTPUT_XML>
<ArrayOfVehicleMake>
<VehicleMake VehMakeId="1" MakeName="VOLKSWAGEN" VehTypeId="1"/>
<VehicleMake VehMakeId="2" MakeName="OPEL" VehTypeId="1"/>
<VehicleMake VehMakeId="3" MakeName="FORD" VehTypeId="1"/>
<VehicleMake VehMakeId="4" MakeName="VAZ" VehTypeId="1"/>
<VehicleMake VehMakeId="5" MakeName="FIAT" VehTypeId="1"/>
</ArrayOfVehicleMake>
</OUTPUT_XML>
您可以反序列化整個列表,而無需遍歷像這樣的單個元素:
XmlSerializer serializer = new XmlSerializer(typeof(List<VehicleMake>));
XmlTextReader reader = new XmlTextReader(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
reader.ReadToDescendant("ArrayOfVehicleMake");
var result = (List<VehicleMake>) serializer.Deserialize(reader);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.