zoukankan      html  css  js  c++  java
  • XML 反序列化

    XML 反序列化成Model
    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);
                }
            }
        }
    

    在这里插入图片描述

  • 相关阅读:
    四叶草社交平台——十天冲刺(7)
    四叶草社交平台——十天冲刺(6)
    多表查询
    单表 查询
    django模板的导入
    2019-3-1
    DJANGO 28
    路由
    Django项目的创建与介绍
    数据传输方式
  • 原文地址:https://www.cnblogs.com/wangqilong/p/12540392.html
Copyright © 2011-2022 走看看