從資料庫中讀取資料,建立XML檔案並更新維護XML
阿新 • • 發佈:2019-02-09
public class OperateXML { /// <summary> /// 檔案全路徑 /// </summary> private string fullFilePath; private string DbName= "SpiderWeb"; private string DbCollectionName= "Data"; MongoClient _Client = null; public FilterDefinitionBuilder<BsonDocument> Filter { get; private set; } public ProjectionDefinitionBuilder<BsonDocument> Projection { get; private set; } /// <summary> /// 檔案方式 /// </summary> private FileInfo InfoFile { get { return new FileInfo(fullFilePath); } } /// <summary> /// 新增XML節點 /// </summary> /// <param name="item"></param> public void AddItem(DataBaseItem item) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fullFilePath); XmlNode root = xmlDoc.SelectSingleNode("ArrayOfDataBaseItem"); XmlElement xe = xmlDoc.CreateElement("DataBaseItem");//建立一個具有指定名稱的子節點 Type t = item.GetType(); foreach(PropertyInfo ppi in t.GetProperties()) { object value = ppi.GetValue(item, null); string name = ppi.Name; XmlElement xmlsub = xmlDoc.CreateElement(name);//建立一個具有指定名稱的元素 if (value == null) value = string.Empty; xmlsub.InnerText = value.ToString();//設定該元素的值 xe.AppendChild(xmlsub);//將該元素新增到item子節點的尾部 } root.AppendChild(xe);//將建立的item子節點新增到items節點的尾部 xmlDoc.Save(fullFilePath);//儲存xml檔案, } /// <summary> /// 修改XML節點 /// </summary> /// <param name="item"></param> public void AlterItem(DataBaseItem item,string NodeName) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(this.fullFilePath); XmlNode xn = xmlDoc.SelectSingleNode("ArrayOfDataBaseItem"); XmlNodeList xnl = xn.ChildNodes; if(xnl.Count>0) { int i = 0; foreach (XmlElement e in xnl[0].ChildNodes) { if (e.Name == NodeName) { break; } i++; } foreach (XmlNode xnf in xnl) { XmlNodeList xnf1 = xnf.ChildNodes; if (xnf1[i].InnerText == item.SpiderName) { Type t = item.GetType(); int j = 0; foreach (PropertyInfo ppi in t.GetProperties()) { object value = ppi.GetValue(item, null); xnf1[j].InnerText = value.ToString();//設定該元素的值 j++; } } } xmlDoc.Save(this.fullFilePath);//再一次強調 ,一定要記得儲存的該XML檔案 } } /// <summary> /// 刪除指定的XML節點 /// </summary> /// <param name="spiderName"></param> private void DelXml(string spiderName,string NodeName) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(this.fullFilePath); XmlNodeList xnl = xmlDoc.SelectSingleNode("ArrayOfDataBaseItem").ChildNodes; if (xnl.Count>0) { int i = 0; foreach (XmlElement e in xnl[0].ChildNodes) { if (e.Name == NodeName) { break; } i++; } foreach (XmlNode xn in xnl) { XmlNodeList xnchilds = xn.ChildNodes; if (xnchilds[i].InnerText == spiderName) { xn.ParentNode.RemoveChild(xn); } } xmlDoc.Save(this.fullFilePath); } } private DataBaseItem GetDataBaseItem(string spiderName,string NodeName) { var item = new DataBaseItem(); return item; } /// <summary> /// 獲取資料庫資訊 /// </summary> /// <returns></returns> public List<DataBaseItem> GetDBsInfoFromXML() { var dataBaseList = new List<DataBaseItem>(); if (InfoFile.Exists) { XmlSerializer xml = new XmlSerializer(dataBaseList.GetType()); using (Stream s = InfoFile.OpenRead()) { try { dataBaseList = xml.Deserialize(s) as List<DataBaseItem>; }catch(Exception e) { Console.WriteLine(e.Message); } } } return dataBaseList; } /// <summary> /// 獲取資料庫資訊 /// </summary> /// <returns></returns> public List<DataBaseItem> GetDBsInfoFromMongoDB() { var dataBaseList = new List<DataBaseItem>(); var SpiderDataBase = _Client.GetDatabase(DbName); var SpiderColletion = SpiderDataBase.GetCollection<BsonDocument>(DbCollectionName); //var Spiders = SpiderColletion.Find(Filter.Empty).Project(Projection.As<SpiderRunEntity>()).ToList(); var Filter = Builders<BsonDocument>.Filter; var builder = Builders<BsonDocument>.Sort; var sort = builder.Descending("_id"); IAsyncCursor<BsonDocument> Cursor; try { Cursor = SpiderColletion.Find(Filter.Empty).Sort(sort).ToCursor(); } catch (Exception e) { Console.WriteLine(e.Message); return null; } while (Cursor.MoveNext()) { foreach (var Document in Cursor.Current) { DataBaseItem item = new DataBaseItem(); foreach (var val in Document.Elements) { Type Ts = item.GetType(); object v = Convert.ChangeType(val.Value, Ts.GetProperty(val.Name).PropertyType); Ts.GetProperty(val.Name).SetValue(item, v, null); } dataBaseList.Add(item); } } return dataBaseList; } /// <summary> /// 生成Xml檔案 /// </summary> private void CreateXmlFile(List<DataBaseItem> dataBases) { XmlSerializer xmls = new XmlSerializer(dataBases.GetType()); using (Stream s = InfoFile.OpenWrite()) { xmls.Serialize(s, dataBases); } } /// <summary> /// 從資料庫中獲取資料,更新XML檔案 /// </summary> private void UpdateXmlFile() { var databaseListMongodb = GetDBsInfoFromMongoDB(); try { Dictionary<string, DataBaseItem> databaseDicXML = GetDBsInfoFromXML().ToDictionary(key => key.SpiderName, value => value); foreach (var db in databaseListMongodb) { if (!databaseDicXML.ContainsKey(db.SpiderName)) AddItem(db); } } catch(Exception e) { Console.WriteLine(e.Message); } } /// <summary> /// 建立XML檔案 /// </summary> private void CreateXmlFile() { if(!File.Exists( this.fullFilePath)) { List<DataBaseItem> dataBaseList = new List<DataBaseItem>(); XmlSerializer xmls = new XmlSerializer(dataBaseList.GetType()); using (Stream s = InfoFile.OpenWrite()) { xmls.Serialize(s, dataBaseList); } } } public OperateXML(string filename,string dbName,string collectionName) { _Client = new MongoClient("mongodb://192.168.106.56:27017"); DbName = dbName; DbCollectionName=collectionName; string appStartPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); StringBuilder builder = new StringBuilder(); builder.Append(appStartPath); builder.Append("\\DatebaseXML\\"); System.IO.DirectoryInfo directoryInfo = new DirectoryInfo(builder.ToString()); if (!directoryInfo.Exists) { directoryInfo.Create();//建立一個 } builder.Append(filename); this.fullFilePath = builder.ToString(); CreateXmlFile(); UpdateXmlFile(); } public OperateXML() { _Client = new MongoClient("mongodb://192.168.106.56:27017"); string appStartPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); StringBuilder builder = new StringBuilder(); builder.Append(appStartPath); builder.Append("\\DatebaseXML\\"); System.IO.DirectoryInfo directoryInfo = new DirectoryInfo(builder.ToString()); if (!directoryInfo.Exists) { directoryInfo.Create();//建立一個 } builder.Append("DateBasesXml.xml"); this.fullFilePath = builder.ToString(); CreateXmlFile(); UpdateXmlFile(); } } public class DataBaseItem { public string _id { get; set; } public string SpiderName { get; set; } public string WebName { get; set; } public DateTime LastDateTime { get; set; } public int RunningStatus { get; set; } public string IndexUrl { get; set; } public string Describe { get; set; } }