c#中对XML反序列化
生成对象类
可以手动生成。
也可以使用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想改为使用英文字段,可以通过XmlElement
和XmlRootAttribute
元素对类进行装饰。
如根节点:
[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);
}