在開發過程中我們可能會進行xml字符傳與指定對象之間進行互相轉換。用XmlSerializer對象可以把C#對象轉換成xml字符串,當然也可以把xml字符串反序爲指定的對象。我們用到以下的類方法進行操作
public class XmlHelper { /// <summary> /// 把對象轉換成xml /// </summary> /// <param name="o"></param> /// <returns></returns> public static string serialize(object o) { var xml = ""; if (o == null) { return xml; } return serialize(o, o.GetType()); } /// <summary> /// 把對象轉換成xml /// </summary> /// <param name="o"></param> /// <param name="type">指定對象類型</param> /// <returns></returns> public static string serialize(object o, Type type) { var xml = ""; if (o == null) { return xml; } //序列化對象 XmlSerializer serializer = new XmlSerializer(type); // 輸出 Stream stream = new MemoryStream(); serializer.Serialize(stream, o); stream.Position = 0; StreamReader sr = new StreamReader(stream); xml = sr.ReadToEnd(); sr.Dispose(); sr.Close(); stream.Dispose(); stream.Close(); return xml; } /// <summary> /// 反序化xml爲對象 /// </summary> /// <param name="xml"></param> /// <param name="type"></param> /// <returns></returns> public static object deserialize(string xml, Type type) { try { using (StringReader sr = new StringReader(xml)) { XmlSerializer serializer = new XmlSerializer(type); return serializer.Deserialize(sr); } } catch (Exception e) { return null; } } }
,在使用時可如下操作:
//對象定義 [XmlRoot("DocumentElement")] public class DocumentElement { //[XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables內包含DataTable [XmlElement("DataTable")] //DataTable平行出現,不出現data public List<MyDataTable> data { get; set; } } [XmlRoot("DataTable")]//在xml文本需要DataTable爲節點名,但DataTable又是C#關鍵字的時候 public class MyDataTable { [XmlElement(IsNullable = true)] public string oper { get; set; } [XmlElement(IsNullable = true)] public string gcode { get; set; } [XmlElement(IsNullable = true)] public string charge_code { get; set; } [XmlElement(IsNullable = true)] public string gname { get; set; } [XmlElement(IsNullable = true)] public string gname1 { get; set; } [XmlElement(IsNullable = true)] public string spn { get; set; } [XmlElement(IsNullable = true)] public string produrceid { get; set; } [XmlElement(IsNullable = true)] public string produrce { get; set; } [XmlElement(IsNullable = true)] public string unit { get; set; } [XmlElement(IsNullable = true)] public string caseunit { get; set; } [XmlElement(IsNullable = true)] public string pack { get; set; } [XmlElement(IsNullable = true)] public string zjm { get; set; } [XmlElement(IsNullable = true)] public string status { get; set; } public decimal price { get; set; } public decimal price1 { get; set; } [XmlElement(IsNullable=true)] public string zbh { get; set; } }
//測試序列化 var xml = ""; DocumentElement de = new DocumentElement(); var mdt = new MyDataTable(); mdt.caseunit = "箱"; mdt.charge_code = "X24538"; var mdt2 = new MyDataTable(); mdt2.caseunit = "箱"; mdt2.charge_code = "X24538"; de.data = new List<MyDataTable>(); de.data.Add(mdt); de.data.Add(mdt2); xml = XmlHelper.serialize(de); Console.WriteLine(xml);
,接下來可以測試xml字符串轉換成類對象
先輸入xml文件,XMLFile1.xml的內容:
<?xml version="1.0" encoding="utf-8" ?> <DocumentElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <DataTable> <oper xsi:nil="true" /> <gcode xsi:nil="true" /> <charge_code>X24538</charge_code> <gname xsi:nil="true" /> <gname1 xsi:nil="true" /> <spn xsi:nil="true" /> <produrceid xsi:nil="true" /> <produrce xsi:nil="true" /> <unit xsi:nil="true" /> <caseunit>箱</caseunit> <pack xsi:nil="true" /> <zjm xsi:nil="true" /> <status xsi:nil="true" /> <price>0</price> <price1>0</price1> <zbh xsi:nil="true" /> </DataTable> <DataTable> <oper xsi:nil="true" /> <gcode xsi:nil="true" /> <charge_code>X24538</charge_code> <gname xsi:nil="true" /> <gname1 xsi:nil="true" /> <spn xsi:nil="true" /> <produrceid xsi:nil="true" /> <produrce xsi:nil="true" /> <unit xsi:nil="true" /> <caseunit>箱</caseunit> <pack xsi:nil="true" /> <zjm xsi:nil="true" /> <status xsi:nil="true" /> <price>0</price> <price1>0</price1> <zbh xsi:nil="true" /> </DataTable> </DocumentElement>
測試反序化:
var content = File.ReadAllText(Environment.CurrentDirectory + @"\XMLFile1.xml"); DocumentElement de = XmlHelper.deserialize(content, typeof(DocumentElement)) as DocumentElement; if (de != null) { var length = de.data.Count; //Console.WriteLine(de.data[length-1].charge_code); foreach (var item in de.data) { Console.WriteLine(item.charge_code); } }
關於參數的說明:
1. [XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables內包含DataTable
默認情況下,集合數據在轉換爲xml字符串時,是父級DataTables包含子集DataTable的形式,如:<DataTables><DataTable>?</DataTable><DataTable>?</DataTable>...</DataTables>
1. [XmlElement("DataTable")] //DataTable平行出現,
當不需要顯示父級DataTables這個字段時,用這種方式註釋,DataTable平行出現,如:<DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable>...