使用C#和Serialize类序列化XML

时间:2017-06-27 13:35:54

标签: c# xml serialization xml-serialization

我正在尝试序列化这个XML并且我已经完成了大部分工作,但我想正确地对信息进行分类,这是我当前的输出。

          <CountryData>
          <CountryName Type="Text">United States of America</CountryName>
          <CountryName Type="Text">Kingdom of Belgium</CountryName>
          <CountryCode Type="Text">US</CountryCode >
          <CountryCode Type="Text">BE</CountryCode >
          <PercentOfBusiness Type="Numeric">0.5</PercentOfBusiness>
          <PercentOfBusiness Type="Numeric">0.5</PercentOfBusiness>
          <AverageBusiness Type="Numeric">3.5%</AverageBusiness >
          <AverageBusiness Type="Numeric">3.5%</AverageBusiness >
          <SalesMade Type="Text">Very low </SalesMade >
          <SalesMade Type="Text">Low</SalesMade >
         </CountryData>

但我希望它像这样

          <CountryData>
            <Country>
               <CountryName Type="Text">United States of America</CountryName>              
               <CountryCode Type="Text">US</CountryCode >         
               <PercentOfBusiness Type="Numeric">0.5</PercentOfBusiness>
               <AverageBusiness Type="Numeric">3.5</AverageBusiness >
               <SalesMade Type="Text">Very low</SalesMade >
            </Country>
            <Country>
               <CountryName Type="Text">Kingdom of Belgium</CountryName>
               <CountryCode Type="Text">BE</CountryCode >
               <PercentOfBusiness Type="Numeric">0.5</PercentOfBusiness>
               <AverageBusiness Type="Numeric">3.5</AverageBusiness >
               <SalesMade Type="Text">low</SalesMade >
               </Country>
              </CountryData>

这就是我所拥有的

    public class CountryData
    {
        #region Public Members
        [XmlElement]
        public List<string> CountryName = new List<string>();
        [XmlElement]
        public List<string> Countrycode= new List<string>();
        [XmlElement]
        public List<string> PercentOfBusiness = new List<string>();
        [XmlElement]
        public List<string> AverageBusiness= new List<string>();
        [XmlElement]
        public List<string> SalesMade= new List<string>();

然后我将这些变量设置为我的Feed和序列化中的w / e值

          XmlSerializer serializer = new XmlSerializer(this.GetType());
            XmlWriterSettings settings = new XmlWriterSettings();
            StringBuilder sb = new StringBuilder();
            XmlWriter writer;

            settings.Indent = true;
            settings.IndentChars = "  ";
            settings.OmitXmlDeclaration = true;

            writer = XmlWriter.Create(sb, settings);
            serializer.Serialize(writer, CountryData);
            writer.Close();
            return sb.ToString();

我是否需要更改实例化序列化对象的方式?还可以删除每个节点的数据类型信息(例如,CountryName Type =“Text”

感谢。

1 个答案:

答案 0 :(得分:5)

您希望CountryData类包含国家/地区列表,例如:

public class CountryData
{
    public List<Country> Countries { get; set; }

    public CountryData() { Countries = new List<Country>(); }
}

public class Country
{
    [XmlElement]
    public string CountryName { get; set; }
    [XmlElement]
    public string Countrycode { get; set; }
    [XmlElement]
    public string PercentOfBusiness { get; set; }
    [XmlElement]
    public string AverageBusiness { get; set; }
    [XmlElement]
    public string SalesMade { get; set; }
}

它会产生一个与你要求的xml略有不同的xml,但它有意义:

<?xml version="1.0" encoding="utf-8"?>
    <CountryData
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Countries>
            <Country>
                <CountryName>name</CountryName>
                <Countrycode>code</Countrycode>
                <PercentOfBusiness>12</PercentOfBusiness>
                <AverageBusiness>123</AverageBusiness>
                <SalesMade>120012</SalesMade>
           </Country>
           <Country>
                <CountryName>name2</CountryName>
                <Countrycode>code2</Countrycode>
                <PercentOfBusiness>34</PercentOfBusiness>
                <AverageBusiness>345</AverageBusiness>
                <SalesMade>453453543</SalesMade>
           </Country>
    </Countries>
</CountryData>

主要方法

public class Program
{
    public static void Main(string[] args)
    {
        XmlSerializer xsSubmit = new XmlSerializer(typeof(CountryData));
        var subReq = new CountryData();
        subReq.Countries.Add(new Country
        {
            CountryName = "name",
            Countrycode = "code",
            PercentOfBusiness = "12",
            AverageBusiness = "123",
            SalesMade = "120012"
        });
        subReq.Countries.Add(new Country
        {
            CountryName = "name2",
            Countrycode = "code2",
            PercentOfBusiness = "34",
            AverageBusiness = "345",
            SalesMade = "453453543"
        });
        var xml = "";

        using (var sww = new StringWriter())
        {
            using (XmlWriter writer = XmlWriter.Create(sww))
            {
                xsSubmit.Serialize(writer, subReq);
                xml = sww.ToString();
            }
        }
    }
}