C#讀取XMLnode
關於C#讀取XML的方法,一直以來都是查資料而後忘記,反覆如此,歷來沒有記住過.今天寫這篇爲了總結一下.固然,時間長了必定也會忘,由於根本不想記住數據庫
一.目標是這樣的XML文件 1.使用狀況 : 爲了將一些少許的數據免去存入數據庫的麻煩,因此使用了XML,因此這個XML的結構和數據庫表字段一對應 例若有一個表page:有四個字段 page (table) id (主鍵編號) name (名字) url (地址) count (計數) 那麼天然對應的XML是這樣 <page id="1" name="nnn" url="uuu" count="100"></page> xml元素的名稱是這個表的名稱,屬性對應字段名.沒有INNERXML.很是清晰 整個XML文件內容可能如此 <?xml version="1.0" encoding="utf-8" ?> <rootxml> <page id="1" name="n1" url="u1" count="100"></page> <page id="2" name="n2" url="u2" count="200"></page> .....更多的記錄(略) </rootxml> 看起來這個文檔就對應這個表,若是有其它表,在根節點下增長元素,以表名爲元素名. 2.上面的結構好像也不合理,有一個方案以下.用數據庫名字做爲根元素名,用表名做子節點名,用item做記錄名. 依然例如這個page表,它處在數據庫mydata中.那麼以下: <?xml version="1.0" encoding="utf-8" ?> <mydata> <page> <item id="1" name="n1" url="u1" count="100"></item> <item id="2" name="n2" url="u2" count="200"></item> </page> .....更多的表(略) </mydata> 看起來結構更好些,能反應數據庫和表的結構.若是有多個表,能夠再增長節點 3.以上兩種結構其實都能達到目的,只是節點層級多少不一樣. 我使用第一種結構,由於不喜歡複雜層級.根節點下就是記錄節點狠好.並且我但願一個XML文檔就 只包含這一個表,若是有多個表就再建多個XML文檔.不但願多表混在一個文檔裏. 固然,當數據量少時,使用第二種結構更好.清晰明白.
二.讀取XML // 創建XMLDOCUMENT對象 XmlDocument xmldoc = new XmlDocument(); // 載入文檔 xmldoc.Load(路徑或流); /* 讀取節點集合 第一個/,表示根目錄,第二個/page,表示根目錄下的page元素節點.這樣和目錄層級相似, 不知道目錄的名字,能夠直接用/,如根目錄,沒有指定名字. */ xmldoc.SelectNodes("//page") /* 還能夠找一個符合條件的元素,好比要id屬性等於1.那麼就是這樣.在page以後的方括號加條件 ,那麼就會找到一個id=1的page元素.這很是有用.相似於查詢page表,where id=1 */ xmldoc.SelectNodes("//page[@@id='1']") // 讀取XML元素的屬性,找到元素節點以後,讀取path屬性 node.Attributes["path"].Value;
三.須要瞭解的知識點:關於XMLELEMENT和XMLNODE 這兩個類的關係是,XmlElement是子,XmlNode是父.表現出來就是XmlElement是XmlNode的一種. 即:Xml節點類型不少:屬性節點、註釋節點、文本節點、元素節點等,都叫XmlNode.而XmlElement指的是元素節點.
四.將XML元素轉換成一個對象 C#中有序列化和反序列化能夠將XML文檔轉爲對象,或者將對象轉爲XML.功能強大.可是: 我目前的任務較簡單,找到page元素以後,將它的屬性數據轉到page對象上. // page元素 <page id="1" name="nnn" url="uuu" count="100"></page> // 要轉成page對象 class Page { public string Id{get;set;} public string Name{get;set;} public string Url{get;set;} public string Count{get;set;} } // 使用反射作到.前提條件是字段名和屬性名對應. /* T:表示XML元素對應的類型,就是Page對象 XmlElement表示一個XML元素,就是page元素 */ public T XmlElementToT(XmlElement xmlelement) { // 建立一個實例 T tmp = System.Activator.CreateInstance(); // 循環當行數據行的全部字段 for (int i = 0; i < xmlelement.Attributes.Count; i++) { XmlAttribute currattr = xmlelement.Attributes[i]; // 使用反射找到出該字段名稱相同的對象的屬性 System.Reflection.PropertyInfo prop = tmp.GetType().GetProperty(currattr.Name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase); // 若是找到了屬性,則設置值.沒找到則不動做(此處可能轉換類型失敗,請儘可能保證屬性類型爲string) if (prop != null) { prop.SetValue(tmp, Convert.ChangeType(currattr.Value, prop.PropertyType)); } } return tmp; }