c#中对XML反序列化

2021-03-12 05:27

阅读:319

标签:忽略   time   数据格式   版本   str   反序   space   公共属性   xsd   

生成对象类

可以手动生成。
也可以使用windows系统自带的xsd.exe工具。

根据不同的windows版本,该工具可能在:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.7.2 Tools
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.7.2 Tools
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools

通过

xsd sample.xml

生成schema文件sample.xsd

然后通过

xsd sample.xsd /c

生成c文件。根据根节点名称会生成对应的class文件代表对应的对象类。

名称修改

如果反序列化时,需要使用不同的属性名来存储,比如xml中使用中文,而json想改为使用英文字段,可以通过XmlElementXmlRootAttribute元素对类进行装饰。

如根节点:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", ElementName = "检测信息", IsNullable = false)]
public partial class SampleClass {}

此时,会将根节点检测信息,读入SampleClass节点

对于子节点:

[XmlElement(ElementName = "公司名称")]
public string CompanyName
{
    get;
    set;
}

可以将公司名称节点读入CompanyName节点。

数据格式化

对于特定类别的数据格式(如时间日期),想对节点数据格式化解析,可以增加私有属性,并且修改公共属性的set方式,解析格式化后再存入私有属性。

如对于XML中yyyy年MM月dd日HH时mm分ss秒格式的日期,想输出为yyyy-MM-dd HH:mm:ss格式:

        public static string TestDateFormatIn = "yyyy年MM月dd日HH时mm分ss秒";
        public static string TestDateFormatOut = "yyyy-MM-dd HH:mm:ss";
        
        //公共属性,反序列化时使用该属性
        public string DATE
        {
            get
            {
                return this.TestDateFormatted;
            }
            set
            {
                System.DateTime parsedDate;
                if (System.DateTime.TryParseExact(value, ArteryXmlDataHelper.TestDateFormatIn, null,
                                   System.Globalization.DateTimeStyles.None, out parsedDate))
                {
                    this.TestDateFormatted = parsedDate.ToString(ArteryXmlDataHelper.TestDateFormatOut);
                }
                else
                {
                    this.TestDateFormatted = value;
                }
            }
        }
        //私有属性,添加[XmlIgnore]使xml反序列化时忽略该属性
        [XmlIgnore]
        public string TestDateFormatted { get; set; }

反序列化

假设生成的序列化类为SampleClass,则反序列化代码为:

XmlSerializer serializer = new XmlSerializer(typeof(ArteryXmlData));
SampleClass xmlData = null;
using (var stream = new FileStream(sample.xml, FileMode.Open))
{
  xmlData = (SampleClass)serializer.Deserialize(stream);
}

c#中对XML反序列化

标签:忽略   time   数据格式   版本   str   反序   space   公共属性   xsd   

原文地址:https://www.cnblogs.com/mosakashaka/p/12608867.html


评论


亲,登录后才可以留言!