程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# XML序列化辦法及經常使用特征總結剖析

C# XML序列化辦法及經常使用特征總結剖析

編輯:C#入門知識

C# XML序列化辦法及經常使用特征總結剖析。本站提示廣大學習愛好者:(C# XML序列化辦法及經常使用特征總結剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C# XML序列化辦法及經常使用特征總結剖析正文


本文實例總結了C# XML序列化辦法及經常使用特征。分享給年夜家供年夜家參考,詳細以下:

C#對象XML序列化(一):序列化辦法和經常使用特征

.Net Framework供給了對應的System.Xml.Seriazliation.XmlSerializer擔任把對象序列化到XML,和從XML中反序列化為對象。Serializer的應用比擬直不雅,須要多留意的是XML序列化相干的Attribute,怎樣把這些attribute運用到我們的對象,和對象公共屬性下面去,生成知足預期格局的XML。

這裡列出了最經常使用的辦法和特征,涵蓋平常年夜部門的轉換任務,願望年夜家在任務中疾速上手。為了給年夜家直不雅的印象,這裡給出詳細的應用代碼,為了節儉篇幅,代碼異常處置沒有添加,列位同窗應用的時刻酌情添加。

1. Serializer辦法

上面的辦法封裝了XmlSerializer的挪用,這裡列出了參數最全的一個版本,詳細應用的時刻需恰當添減輕載:

public static class XmlSerializer
{
  public static void SaveToXml(string filePath, object sourceObj, Type type, string xmlRootName)
  {
    if (!string.IsNullOrWhiteSpace(filePath) && sourceObj != null)
    {
      type = type != null ? type : sourceObj.GetType();
      using (StreamWriter writer = new StreamWriter(filePath))
      {
        System.Xml.Serialization.XmlSerializer xmlSerializer = string.IsNullOrWhiteSpace(xmlRootName) ?
          new System.Xml.Serialization.XmlSerializer(type) :
          new System.Xml.Serialization.XmlSerializer(type, new XmlRootAttribute(xmlRootName));
        xmlSerializer.Serialize(writer, sourceObj);
      }
    }
  }
  public static object LoadFromXml(string filePath, Type type)
  {
    object result = null;
    if (File.Exists(filePath))
    {
      using (StreamReader reader = new StreamReader(filePath))
      {
        System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(type);
        result = xmlSerializer.Deserialize(reader);
      }
    }
    return result;
  }
}

2. 序列化經常使用Attribute講授解釋:

[XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=false)]   // 當該類為Xml根節點時,以此為根節點稱號。
public class City
[XmlAttribute("AreaName")]  // 表示為Xml節點屬性。<... AreaName="..."/>
public string Name
[XmlElementAttribute("AreaId", IsNullable = false)]  // 表示為Xml節點。<AreaId>...</AreaId>
public string Id
[XmlArrayAttribute("Areas")]  // 表示為Xml條理構造,根為Areas,其所屬的每一個該聚集節點元素名為類名。<Areas><Area ... /><Area ... /></Areas>
public Area[] Areas
[XmlElementAttribute("Area", IsNullable = false)]  // 表示為程度構造的Xml節點。<Area ... /><Area ... />...
public Area[] Areas
[XmlIgnoreAttribute]  // 疏忽該元素的序列化。

3. 具體舉例解釋

這裡用簡略的城市,區域和街區作為例子,詳細示范一下下面的規矩。

[XmlRootAttribute("MyCity", Namespace = "abc.abc", IsNullable = false)]
public class City
{
  [XmlAttribute("CityName")]
  public string Name
  {
    get;
    set;
  }
  [XmlAttribute("CityId")]
  public string Id
  {
    get;
    set;
  }
  [XmlArrayAttribute("Areas")]
  public Area[] Areas
  {
    get;
    set;
  }
}
[XmlRootAttribute("MyArea")]
public class Area
{
  [XmlAttribute("AreaName")]
  public string Name
  {
    get;
    set;
  }
  [XmlElementAttribute("AreaId", IsNullable = false)]
  public string Id
  {
    get;
    set;
  }
  [XmlElementAttribute("Street", IsNullable = false)]
  public string[] Streets
  {
    get;
    set;
  }
}

依據以上類型,我們mock一些數據,然後用步調1給出的Util辦法輸入:

static void Main(string[] args)
{
  Area area1 = new Area();
  area1.Name = "Pudong";
  area1.Id = "PD001";
  area1.Streets = new string [] { "street 001", "street 002" };
  Area area2 = new Area();
  area2.Name = "Xuhui";
  area2.Id = "XH002";
  area2.Streets = new string [] { "street 003", "street 004" };
  City city1 = new City();
  city1.Name = "Shanghai";
  city1.Id = "SH001";
  city1.Areas = new Area[] { area1, area2 };
  XmlSerializer.SaveToXml(@"C:\temp\XML\output003.xml", city1);
}

終究輸入的XML為:

<?xml version="1.0" encoding="utf-8"?>
<MyCity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CityName="Shanghai" CityId="SH001" xmlns="abc.abc">
 <Areas>
  <Area AreaName="Pudong">
   <AreaId>PD001</AreaId>
   <Street>street 001</Street>
   <Street>street 002</Street>
  </Area>
  <Area AreaName="Xuhui">
   <AreaId>XH002</AreaId>
   <Street>street 003</Street>
   <Street>street 004</Street>
  </Area>
 </Areas>
</MyCity>

上面我們開端詳細剖析成果,個中包括一些很有效的結論和留意事項:

1. xml的版本,編碼,和定名空間xmlns:xsi,xmlns:xsd為Framework主動添加。
2. 由於我們用City對象作為根節點,所以根節點稱號為我們界說的"MyCity"。
然則,留意!這裡指的是用City本身直接做根節點,假如是City聚集好比City[],此時,該稱號掉效,體系會主動生成稱號ArrayOfCity作為根節點稱號(ArrayOf+類名),或許我們手動指命名稱,這個就是在給年夜家的SaveToXml()辦法中,參數xmlRootName的感化。
3. 假如以City為根節點並在XmlRootAttribute特征中給命名稱,同時也手動指定了xmlRootName,體系會以手動指定的稱號為准。
4. AreaName,AreaId,同為Area類的公共屬性,一個被說明成屬性,一個被說明成子節點。
Areas聚集被說明成了條理構造,Streets聚集被說明成了程度構造。
這兩組差別最能表現分歧序列化Attribute的用法。

PS:小編這裡再來為年夜家推舉幾款關於xml操作的在線對象供年夜家無償使用。信任在今後開辟中可以用的到:

在線XML格局化/緊縮對象:
http://tools.jb51.net/code/xmlformat

在線XML/JSON相互轉換對象:
http://tools.jb51.net/code/xmljson

xml代碼在線格局化丑化對象:
http://tools.jb51.net/code/xmlcodeformat

HTML/XML本義字符對比表:
http://tools.jb51.net/table/html_escape

願望本文所述對年夜家C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved