提綱:
本文涉及的內容主要是有關本地XML的解析(同理,Web端的XML資料解析方法一樣),然後將解析的XML資料儲存到SQL CE資料庫中。
SQL CE資料庫是在程式中建立的,並儲存在隔離儲存區 (Isolated Storage)地區,因此在項目中是看不到的。
參考博文:
http://blog.csdn.net/fengyun1989/article/details/7342774
第一部分:XML解析
圖圖說明11:
1.確保項目中包含System.Xml.Ling和System.Xml的引用,沒有引用的自己添加引用即可。
2.代碼如下:
//讀取資源檔xml StreamResourceInfo sri = Application.GetResourceStream(new Uri("/MyWeatherForeCast;component/citycode.xml", UriKind.Relative)); string result; using (StreamReader sr = new StreamReader(sri.Stream)) { result = sr.ReadToEnd(); } //解析XML XDocument doc = XDocument.Parse(result); foreach (XElement item in doc.Descendants("root").Nodes()) { string province = item.Attribute("data").Value; foreach (XElement itemnode in item.Descendants("city")) { string cityname = itemnode.Element("cityname").Value; string cityid = itemnode.Element("cityid").Value; //把資料存入資料庫 CityInfoTable cityInfo = new CityInfoTable(); cityInfo.CityCode = cityid; cityInfo.Province = province; cityInfo.CityName = cityname; db.CityInfos.InsertOnSubmit(cityInfo); } }
代碼說明:
StreamResourceInfo用來解析resource資源,因此此步驟之前先將XML檔案屬性修改為Resource。
XDocument接收XML文檔
XElement表示XML節點元素
doc.Descendants("root").Nodes()表示Root節點下的所有子節點
item.Attribute("data").Value擷取節點data的值
以上部分就是XML解析的步驟,解析之前只需要知道對應的節點的名稱即可。
=============================================
第2部分:SQL CE的使用(建立資料庫和查詢資料)
1.首先添加資料庫需要的System.data.ling引用
2.建立資料庫表的結構
建立表的結構:CityInfoTable.cs
namespace MyWeatherForeCast{ [Table] public class CityInfoTable { private int _cityInfoId; [Column(IsPrimaryKey=true,IsDbGenerated=true,DbType="INT NOT NULL Identity",CanBeNull=false,AutoSync=AutoSync.OnInsert) ] public int CityInfoId { get { return _cityInfoId; } set { _cityInfoId = value; } } private string _province; [Column ] public string Province { get { return _province; } set { _province = value; } } private string _cityName; [Column ] public string CityName { get { return _cityName; } set { _cityName = value; } } private string _cityCode; [Column] public string CityCode { get { return _cityCode; } set { _cityCode = value; } } }}
代碼說明:
[Table]表示類CityInfoTable為一張表,必須包含此欄位,不然建立資料庫時會有表不存在的錯誤。
_cityInfoId,_province,_cityName,_cityCode表示表的4個欄位.
[Column]表示是資料庫表中一列,[Column(....)]表示該列存在哪些屬性性質.
3.建立資料庫表
CityDataContext.cs檔案用來建立資料庫:
public class CityDataContext:DataContext { //定義資料庫連接字串 public static string connectionString = "Data Source=isostore:/CityInfo.sdf"; //// 傳遞資料庫連接字串到DataContext基類 public CityDataContext(string connectionString) : base(connectionString) { } //定義一個資料表,如果有多個資料表也可以繼續添加為成員變數 public Table<CityInfoTable> CityInfos { get { return this.GetTable<CityInfoTable>(); } } }
代碼說明:
CityDataContext繼承自DataContext。
connectionString作為資料庫連接字串,儲存於隔離儲存區 (Isolated Storage)地區的CityInfo.sdf檔案中。
CityInfos為資料庫表的名稱。
4.添加資料
private void CreateDB() { using (CityDataContext db = new CityDataContext(CityDataContext.connectionString)) { if (db.DatabaseExists()==false) { //建立資料庫 db.CreateDatabase(); //讀取資源檔xml StreamResourceInfo sri = Application.GetResourceStream(new Uri("/MyWeatherForeCast;component/citycode.xml", UriKind.Relative)); string result; using (StreamReader sr = new StreamReader(sri.Stream)) { result = sr.ReadToEnd(); } //解析XML XDocument doc = XDocument.Parse(result); foreach (XElement item in doc.Descendants("root").Nodes()) { string province = item.Attribute("data").Value; foreach (XElement itemnode in item.Descendants("city")) { string cityname = itemnode.Element("cityname").Value; string cityid = itemnode.Element("cityid").Value; //把資料存入資料庫 CityInfoTable cityInfo = new CityInfoTable(); cityInfo.CityCode = cityid; cityInfo.Province = province; cityInfo.CityName = cityname; db.CityInfos.InsertOnSubmit(cityInfo); } } //資料庫提交更新 db.SubmitChanges(); } } }
代碼說明:
CityInfoTable cityInfo = new CityInfoTable();
cityInfo.CityCode = cityid;
cityInfo.Province = province;
cityInfo.CityName = cityname;
db.CityInfos.InsertOnSubmit(cityInfo);
cityInfo為一張建立的資料表,添加資料後,添加到CityInfos資料庫表中,並提交。
-------------------------------------
補充查詢語句:
查詢北京市的城市資訊,並彈窗顯示出來。
1. using (CityDataContext db = new CityDataContext(CityDataContext.connectionString)) { IQueryable<CityInfoTable> queries = from c in db.CityInfos where c.Province == "北京" && c.CityName == "北京" select c; MessageBox.Show(queries.First().CityName + queries.First().CityCode);}
查詢語句簡單說明:
2.IQueryable<CityInfoTable> queries = from c in db.CityInfos where c.Province == prov select c;--IQueryable表示查詢;CityInfoTable是表結構;c為固定寫法,db.CityInfos為查詢的表;where表示查詢條件3.var queries = from c in db.CityInfos where (c.Province == province && c.CityName == cityName) select c;--where (c.Province == province && c.CityName == cityName)為多條查詢條件