XML 反序列化
1.方法:
public static object DeserializeXml(Type type, string xml) { using (StringReader sr = new StringReader(xml)) { XmlSerializer desXml = new XmlSerializer(type); return desXml.Deserialize(sr); } } //如何调用 DeserializeXml(typeof(Model), xml) as Model;
2.Model中属性与XML节点编注
在反序列化过程中,XML是根据节点将数据放入到Model中,在Model属性对应的XML节点必须要标记清楚,包括XML的命名空间和根节点都要标清,注意XML节点的层级,在Model中也要一一对应,否则可能会反序列化失败。
//根节点 命名空间标记 [XmlRoot(Namespace = "http://xmlSerialization.com/schema/TestDemo", ElementName = "GetResponse", IsNullable = false)] //节点标记 [XmlElement(ElementName = "GetMyResult")]
3.示例:
3.1 XML文档
<GetResponse xmlns="http://xmlSerialization.com/schema/TestDemo"> <GetMyResult> <FeesEstimateResultList> <FeesEstimateResult> <FeesEstimate> <TotalFeesEstimate> <CurrencyCode>RMB</CurrencyCode> <Amount>29.96</Amount> //需要 </TotalFeesEstimate> </FeesEstimate> <FeesEstimateIdentifier> <IdValue>ZZ12345</IdValue> //需要 <PriceToEstimateFees> <ListingPrice> <CurrencyCode>RMB</CurrencyCode> <Amount>499.37</Amount> //需要 </ListingPrice> <Shipping> <CurrencyCode>RMB</CurrencyCode> <Amount>0</Amount> </Shipping> </PriceToEstimateFees> </FeesEstimateIdentifier> <Status>Success</Status> //需要 </FeesEstimateResult> </FeesEstimateResultList> </GetMyResult> </GetResponse>
上面备注需要为Model的内容,既需要提取XML中的数据。
3.2 Model类
//XML 根 命名空间 [XmlRoot(Namespace = "http://xmlSerialization.com/schema/TestDemo", ElementName = "GetResponse", IsNullable = false)] public class RequestResponse { //对应XML中节点名称 [XmlElement(ElementName = "GetMyResult")] public GetMyFeesEstimateResult getMyFeesEstimateResult; } public class GetMyFeesEstimateResult { [XmlElement(ElementName = "FeesEstimateResultList")] public FeesEstimateResultList feesEstimateResultList; } public class FeesEstimateResultList { [XmlElement(ElementName = "FeesEstimateResult")] public List<FeesEstimateResult> feesEstimateResult; } public class FeesEstimateResult { [XmlElement(ElementName = "FeesEstimate")] public FeesEstimate feesEstimate; [XmlElement(ElementName = "FeesEstimateIdentifier")] public FeesEstimateIdentifier feesEstimateIdentifier; [XmlElement(ElementName = "Status")] public string Status; //需要 } public class FeesEstimate { [XmlElement(ElementName = "TotalFeesEstimate")] public TotalFeesEstimate totalFeesEstimate; } public class TotalFeesEstimate { [XmlElement(ElementName = "Amount")] public decimal Fee; //需要 } public class FeesEstimateIdentifier { [XmlElement(ElementName = "IdValue")] public string SKU; //需要 [XmlElement(ElementName = "PriceToEstimateFees")] public PriceToEstimateFees priceToEstimateFees; } public class PriceToEstimateFees { [XmlElement(ElementName = "ListingPrice")] public ListingPrice listingPrice; } public class ListingPrice { [XmlElement(ElementName = "Amount")] public decimal Price; //需要 } }
其实需要XML中的数据只有四个,但这个Model却要根据XML层级来写,所以很复杂。在得到反序列化后这个Model后想到里面的数据会一层一层取麻烦,所以在建一个Model如下:
namespace XMLSerializer.Model { public class ResponseModel { public string Status { get; set; } public string SKU { get; set; } public decimal Fee { get; set; } public decimal Price { get; set; } public void ToWriteLineString() { Console.WriteLine("Status:"+Status+ ",SKU:"+ SKU+ ",Fee:"+ Fee+ ",Price:"+ Price); } }
3.3 入口程序
public class Program { public static void Main(string[] args) { string xml = "<GetResponse xmlns=\"http://xmlSerialization.com/schema/TestDemo\"><GetMyResult><FeesEstimateResultList><FeesEstimateResult><FeesEstimate><TotalFeesEstimate><CurrencyCode>RMB</CurrencyCode><Amount>29.96</Amount></TotalFeesEstimate></FeesEstimate><FeesEstimateIdentifier><IdValue>ZZ12345</IdValue><PriceToEstimateFees><ListingPrice><CurrencyCode>RMB</CurrencyCode><Amount>499.37</Amount></ListingPrice><Shipping><CurrencyCode>RMB</CurrencyCode><Amount>0</Amount></Shipping></PriceToEstimateFees></FeesEstimateIdentifier><Status>Success</Status></FeesEstimateResult></FeesEstimateResultList></GetMyResult></GetResponse>"; RequestResponse RequestResponse= DeserializeXml(typeof(RequestResponse), xml) as RequestResponse; //将XML数据放到ResponseModel中 ResponseModel responseModel = new ResponseModel(); responseModel.Status = RequestResponse.getMyFeesEstimateResult.feesEstimateResultList.feesEstimateResult[0].Status; responseModel.SKU = RequestResponse.getMyFeesEstimateResult.feesEstimateResultList.feesEstimateResult[0].feesEstimateIdentifier.SKU; responseModel.Fee = RequestResponse.getMyFeesEstimateResult.feesEstimateResultList.feesEstimateResult[0].feesEstimate.totalFeesEstimate.Fee; responseModel.Price = RequestResponse.getMyFeesEstimateResult.feesEstimateResultList.feesEstimateResult[0].feesEstimateIdentifier.priceToEstimateFees.listingPrice.Price; responseModel.ToWriteLineString(); Console.ReadKey(); } //反序列化 public static object DeserializeXml(Type type, string xml) { using (StringReader sr = new StringReader(xml)) { XmlSerializer desXml = new XmlSerializer(type); return desXml.Deserialize(sr); } } }
浙公网安备 33010602011771号