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