1. 程式人生 > >從資料庫中讀取資料,建立XML檔案並更新維護XML

從資料庫中讀取資料,建立XML檔案並更新維護XML

    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; }
    }