1. 程式人生 > >C#解析XML——使用屬性控制XML序列化

C#解析XML——使用屬性控制XML序列化

使用屬性可以控制物件的 XML 序列化。

預設情況下,XML 元素名稱由類或成員名稱確定。在名為 Book 的簡單類中,欄位 ISBN 將生成 XML 元素標記 <ISBN>,如下面的示例所示。

  1. publicclass Book  
  2. {  
  3.     publicstring ISBN;  
  4. }  
  5. // When an instance of the Book class is serialized, it might 
  6. // produce this XML:
  7. // <ISBN>1234567890</ISBN>.

若要重新命名元素,可以更改這種預設行為。下面的程式碼演示屬性 (Attribute) 如何通過設定 XmlElementAttribute 的 ElementName 屬性 (Property) 實現此目的。

  1. publicclass TaxRates{  
  2.     [XmlElement(ElementName = "TaxRate")]  
  3.     publicdecimal ReturnTaxRate;  
  4. }  

XmlArrayAttribute 和 XmlArrayItemAttribute 屬性旨在用於控制陣列的序列化。使用這些屬性可以控制元素名稱、名稱空間以及 XML 架構 (XSD) 資料型別(在全球資訊網聯合會 [www.w3.org] 文件“XML 架構第 2 部分:資料型別”中進行了定義)。此外,還可以指定陣列所能包含的型別。

對於序列化陣列時生成的封閉 XML 元素,其屬性將由 XmlArrayAttribute

 確定。例如,預設情況下,序列化下面的陣列時,將會生成名為Employees 的 XML 元素。Employees 元素將包含在陣列型別Employee 之後命名的一系列元素。

  1. publicclass Group{  
  2.     public Employee[] Employees;  
  3. }  
  4. publicclass Employee{  
  5.     publicstring Name;  
  6. }  

序列化例項可能如下所示。

  1. <Group>
  2. <Employees>
  3.     <Employee>
  4.         <
    Name>Haley</Name>
  5.     </Employee>
  6. </Employees>
  7. </Group>

通過應用 XmlArrayAttribute,可以按照以下方式更改 XML 元素的名稱。

  1. publicclass Group{  
  2.     [XmlArray("TeamMembers")]  
  3.     public Employee[] Employees;  
  4. }  

生成的 XML 可能如下所示。

  1. <Group>
  2. <TeamMembers>
  3.     <Employee>
  4.         <Name>Haley</Name>
  5.     </Employee>
  6. </TeamMembers>

另一方面,XmlArrayItemAttribute 可以控制如何序列化陣列中包含的項。請注意,該屬性將應用於返回陣列的欄位。

  1. publicclass Group{  
  2.     [XmlArrayItem("MemberName")]  
  3.     public Employee[] Employees;  
  4. }  

生成的 XML 可能如下所示。

  1. <Group>
  2. <Employees>
  3.     <MemberName>Haley</MemberName>
  4. </Employees>
  5. </Group>

序列化派生類

XmlArrayItemAttribute 的另一種用法是,允許序列化派生類。例如,可將派生自 Employee 的另一個名為Manager 的類新增至上一示例中。如果沒有應用XmlArrayItemAttribute,程式碼將在執行時失敗,原因是無法識別派生類型別。若要解決這個問題,每次為每個可接受型別(基類和派生類)設定 Type 屬性 (Property) 時,需要應用該屬性 (Attribute) 兩次。

  1. publicclass Group{  
  2.     [XmlArrayItem(Type = typeof(Employee)),  
  3.     XmlArrayItem(Type = typeof(Manager))]  
  4.     public Employee[] Employees;  
  5. }  
  6. publicclass Employee{  
  7.     publicstring Name;  
  8. }  
  9. publicclass Manager:Employee{  
  10.     publicint Level;  
  11. }  

序列化例項可能如下所示。

  1. <Group>
  2. <Employees>
  3.     <Employee>
  4.         <Name>Haley</Name>
  5.     </Employee>
  6.     <Employeexsi:type = "Manager">
  7.         <Name>Ann</Name>
  8.         <Level>3</Level>
  9.     <Employee>
  10. </Employees>
  11. </Group>

將陣列作為元素序列進行序列化

通過將 XmlElementAttribute 應用於返回陣列的欄位,還可以將該陣列作為 XML 元素的平面序列進行序列化,如下所示。

  1. publicclass Group{  
  2.     [XmlElement]  
  3.     public Employee[] Employees;  
  4. }  

序列化例項可能如下所示。

  1. <Group>
  2. <Employees>
  3.     <Name>Haley</Name>
  4. </Employees>
  5. <Employees>
  6.     <Name>Noriko</Name>
  7. </Employees>
  8. 相關推薦

    C#解析XML——使用屬性控制XML序列

    使用屬性可以控制物件的 XML 序列化。 預設情況下,XML 元素名稱由類或成員名稱確定。在名為 Book 的簡單類中,欄位 ISBN 將生成 XML 元素標記 <ISBN>,如下面的示例所示。 publicclass Book  

    Android中XML文件的序列生成與解析

    eval test director 南海 attribute trac cli found dir 首先,我把Person的實體類 package net.loonggg.test; public class Person { privat

    C# Newtonsoft.Json JObject移除屬性,在序列時忽略

    -h 大小 reac plain bsp source images too 實例 原文 C# Newtonsoft.Json JObject移除屬性,在序列化時忽略 一、針對 單個 對象移除屬性,序列化時忽略處理 JObject實例的 Remove() 方法,可以在

    把物件序列化為xml格式和反序列

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text;

    Unity3d 實現物件的XML格式化和反序列

      但是網頁平臺不支援(如果資料庫放在服務端,就沒有這個問題了), 所以想到用XML格式來儲存資料,資料量也不大,操作也簡單,可以直接將物件存為xml檔案,而且玩家本地存檔也會用到。using UnityEngine;using System.Collections;using System.Collecti

    C# json字符串反序列

    使用 字符 方法 new style col tty ado json.js 使用情景:開發中JS傳遞一個Json格式的字符串到後臺,後臺將json字符串轉化成list集合 1 public static class json 2 { 3 p

    C# 使用 protobuf 進行對象序列與反序列

    member 開源項目 serial all 序列化與反序列化 ace ogl serialize dll protobuf 是 google的一個開源項目,可用於以下兩種用途: (1)數據的存儲(序列化和反序列化),類似於xml、json等; (2)制作網絡通信協議。

    C# Newtonsoft.Json JsonSerializerSettings 全局序列設置

    aps defaults rac n-n col property bsp () hidden Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettin

    C 下JSON字串的反序列

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    C++ protobuf在QT中的序列和反序列

    序列化 //自己定義的protobuf資料型別 NET_MSG msg; QByteArray msgBytes = QByteArray(msg.ByteSize(),0); //序列化 msg.SerializeToArray(msgBytes.data(), ms

    《程序設計基礎》實驗題目2 c文件讀取(反序列?) 鏈表排序

    max malloc 哨兵 scan 遞歸 初始化 直接 元素 oid 題目:   每個學生的信息卡片包括學號、姓名和成績三項。定義存儲學生信息的單向鏈表的結點類型;編寫函 數,由文件依次讀入 n(n≥0)個學生的信息,創建一個用於管理學生信息的單向鏈表;編寫函數,對 該鏈

    C#在unity中關於類序列的簡述

    一個類如果不是繼承MonoBehaviour,那他的物件在public的情況下也不會在屬性面板顯示。 如果某個欄位想故意在unity屬性面板隱藏可使用 [HideInInspector]//設定在面板中隱藏(不影響其他屬性) 此時需要手動將他序列化 可以使用[Se

    DRF之解析器組件及序列組件

    除了 queryset 服務器 字段 color stat 需求 使用方式 更新   通過上一篇博客的學習,我們已經有了一個共識,Django無法處理application/json協議請求的數據,即,如果用戶通過application/json協議發送請求數據到達Djan

    transient關鍵字與物件的屬性不被序列

    當某個物件的屬性不希望被序列化時,可以使用transient關鍵字進行宣告 import java.io.Serializable ; public class Person implements Serializable{private transient String

    關於fastjson對空屬性不進行序列

          今天,在和移動端對接的過程中,發現gson對空字串,存在序列化到物件存在異常的問題,這個問題我們想從給物件設定預設值,這個我覺得對程式的侵入太深,況且容易因為疏忽,導致不全,然後採用一種統一的方式來解決,這樣就可以從上層解決問題,最終我們決定採用空屬性不進行序列化

    C# 利用Newtonsoft.Json進行Json序列與反序列

    我們可以通過DataContractJsonSerializer類來序列化一個物件為json字串。 public class JsonConvert<T> { public stat

    用@XmlType的propOrder屬性 來指定序列的順序。

    預設情況下,Jaxb編組出來的xml中的欄位順序是隨機的,你可以使用@XmlType的propOrder屬性 來指定序列化的順序。 第一步:定義java類時,使用@XmlType(propOrder = { "id", "name", "age","book"})指

    C#學習筆記(6)-序列與反序列

    序列化 就是將物件轉換為二進位制 反序列化 就是將二進位制轉換為物件 作用 傳輸資料。資料在網路中是以二進位制形式傳輸的。 序列化的類不能被繼承 關鍵字 [Serializable]:定義一個類可被序列化 [Serializable]

    C#中使用Json.Net進行序列和反序列及定製

      序列化(Serialize)是將物件轉換成位元組流,並將其用於儲存或傳輸的過程,主要用途是儲存物件的狀態,以便在需要時重新建立該物件;反序列化(Deserialize)則是將上面的位元組流轉換為相應物件的過程;在.Net陣營中,Json.Net是由官方推薦的高效能開源序列化/反序列化工具,其官方網站:ht

    C#反序列xml轉化為實體

    class get c# sta spa bytes return doc 序列化 public static T DeserialXmlToModel<T>(string xmlDocument) { T cmdOb