using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using XRTool.Util;
///
/// 一个xml编辑器
///
namespace PublicTools.XMLDataBase
{
///
/// 针对某个xml文件进行编辑的类
///
public class XMLDataEditor : TableInterface
{
private XmlDocument xmlDoc; //可操作的xml文档
private XmlNode xmlRootNode; //根节点
///
/// 文件的绝对路径
///
private string filePath;
///
/// 表格的名称
///
private string tableName;
///
/// 根节点的名称
///
///
/// 以绝对路径创建一个对象
///
///
public XMLDataEditor(string filePath)
{
this.filePath = filePath;
}
public XMLDataEditor()
{
}
public bool Open()
{
return Open(filePath);
}
///
/// 打开xml表格
///
///
///
public bool Open(string path)
{
if (xmlDoc != null && !string.IsNullOrEmpty(this.filePath))
{
return true;
}
///开启之前先关闭
//Close();
if (File.Exists(path))
{
xmlDoc = new XmlDocument();
tableName = Path.GetFileNameWithoutExtension(path);
try
{
xmlDoc.Load(path);
xmlRootNode = xmlDoc.SelectSingleNode(tableName);
return xmlRootNode != null;
}
catch (Exception ex)
{
UnityLog.LogError(path + ex.ToString());
}
}
return false;
}
public void Close()
{
if (xmlDoc != null && !string.IsNullOrEmpty(filePath))
{
try
{
xmlDoc.Save(filePath);
xmlDoc = null;
//filePath = null;
}
catch (Exception ex)
{
UnityLog.LogError(filePath + "\n" + ex.ToString());
}
}
}
public bool InsertData(T data, string priKey)
{
Dictionary field = ClazzFactory.ClazzAnalyze(data);
if (field != null && field.Count > 0)
{
XmlNode table = xmlRootNode;
if (string.IsNullOrEmpty(priKey))
{
foreach (var item in field)
{
priKey = item.Value;
break;
}
}
return InsertData(data, table, field, priKey);
}
return false;
}
///
/// 插入数据
///
///
///
///
private bool InsertData(T data, XmlNode table, Dictionary field, string priKey)
{
try
{
if (string.IsNullOrEmpty(priKey) || priKey == "null")
{
return false;
}
if (table.SelectSingleNode(priKey) != null)
{
return UpdateData(data, table, field, priKey);
}
///添加一条数据
///按照key值添加一个节点元素
XmlElement element = xmlDoc.CreateElement(priKey);
///循环遍历变量集合,将类的数据集合起来添加
foreach (var item in field)
{
XmlAttribute xa = xmlDoc.CreateAttribute(item.Key);
xa.Value = item.Value;
element.Attributes.Append(xa);
}
table.AppendChild(element);
return true;
}
catch (Exception ex)
{
UnityLog.LogError(data + " " + priKey + ex.ToString());
Close();
}
return false;
}
public bool InsertData(T data)
{
return InsertData(data, null);
}
///
/// 尝试获取xml的一个表,如果此xml没有此表,则创建一个
///
///
///
public XmlNode TryGetTable(string tableName)
{
XmlNode node = xmlRootNode.SelectSingleNode(tableName);
if (node != null)
{
return node;
}
return CreateTable(tableName);
}
///
/// 创建一个子节点
///
///
public XmlNode CreateTable(string tableName)
{
XmlNode table = xmlDoc.CreateElement(tableName);
xmlRootNode.AppendChild(table);
Save();
return table;
}
///
///
///
///
///
///
public T FindData(string priKey)
{
T t = default(T);
XmlNode table = xmlRootNode;
try
{
XmlNode obj = table.SelectSingleNode(priKey);
if (obj != null)
{
Dictionary dic = new Dictionary();
for (int i = 0; i < obj.Attributes.Count; i++)
{
dic.Add(obj.Attributes[i].LocalName, obj.Attributes[i].Value);
}
t = ClazzFactory.ClazzPack(dic);
}
}
catch (Exception ex)
{
Close();
UnityLog.LogError(priKey + ex.ToString());
}
return t;
}
public List FindAllData()
{
XmlNode table = xmlRootNode;
if (table == null || table.ChildNodes.Count == 0)
{
return null;
}
List list = new List();
for (int i = 0; i < table.ChildNodes.Count; i++)
{//遍历表的子节点
Dictionary values = new Dictionary();
for (int j = 0; j < table.ChildNodes[i].Attributes.Count; j++)
{
values.Add(table.ChildNodes[i].Attributes[j].LocalName, table.ChildNodes[i].Attributes[j].Value);
}
list.Add(ClazzFactory.ClazzPack(values));
}
return list;
}
public List FindAllData(string data)
{
return null;
}
///
/// 查找所有对象
///
///
///
public List FindAllData(byte[] data)
{
try
{
xmlDoc = new XmlDocument();
string xmlStr = UnityUtil.GetUTF8String(data);
xmlDoc.LoadXml(xmlStr);
tableName = typeof(T).Name;
xmlRootNode = xmlDoc.SelectSingleNode(tableName);
}
catch (Exception ex)
{
UnityLog.LogError(ex.ToString());
}
return FindAllData();
}
public bool UpdateData(T data, string priKey)
{
Dictionary field = ClazzFactory.ClazzAnalyze(data);
if (field != null && field.Count > 0)
{
XmlNode table = xmlRootNode;
if (string.IsNullOrEmpty(priKey))
{
foreach (var item in field)
{
priKey = item.Value;
break;
}
}
return UpdateData(data, table, field, priKey);
}
return false;
}
private bool UpdateData(T data, XmlNode table, Dictionary field, string priKey)
{
try
{
XmlNode obj = table.SelectSingleNode(priKey);
if (obj == null)
{
//待更新数据不存在,更新失败
return false;
}
///需要判断变量名是否发生了变化
bool isChanged = false;
if (obj.Attributes.Count != field.Count)
{
isChanged = true;
}
if (!isChanged)
{
int index = 0;
foreach (var item in field)
{
///变量名不一致
if (obj.Attributes[index].LocalName != item.Key)
{
isChanged = true;
break;
}
index++;
}
}
if (isChanged)
{
if (DeleteData(priKey))
{
return InsertData(data, priKey);
}
else
{
return false;
}
}
else
{
foreach (var item in field)
{
if (obj.Attributes[item.Key].Value != item.Value)
{
obj.Attributes[item.Key].Value = item.Value;
isChanged = true;
}
}
}
return isChanged;
}
catch (Exception ex)
{
UnityLog.LogError(data + " " + priKey + ex.ToString());
Close();
}
return false;
}
public bool UpdateData(T data)
{
return UpdateData(data, null);
}
public bool DeleteData(string key)
{
XmlNode table = xmlRootNode;
try
{
XmlNode obj = table.SelectSingleNode(key);//按照key值确定元素对象
if (obj == null)
{
return false;
}
obj.RemoveAll();
table.RemoveChild(obj);
return true;
}
catch (Exception ex)
{
UnityLog.LogError(ex.ToString());
}
return false;
}
public bool DeleteAllData()
{
try
{
XmlNode table = xmlRootNode;
table.RemoveAll();
return true;
}
catch (Exception ex)
{
UnityLog.LogError(ex.ToString());
}
return false;
}
///
/// 建表
///
///
///
public bool Create(string tableName)
{
try
{
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate);
if (xmlDoc == null)
{
xmlDoc = new XmlDocument();
}
this.tableName = Path.GetFileNameWithoutExtension(tableName);
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlRootNode = xmlDoc.CreateElement(this.tableName);
xmlDoc.AppendChild(xmlDeclaration);
xmlDoc.AppendChild(xmlRootNode);
fs.Dispose();
fs.Close();
return xmlRootNode != null;
}
catch (Exception ex)
{
UnityLog.Log("Create Error" + this.tableName + ex.ToString());
}
return false;
}
public void Save()
{
if (xmlDoc != null && !string.IsNullOrEmpty(filePath))
{
try
{
xmlDoc.Save(filePath);
}
catch (Exception ex)
{
UnityLog.LogError(filePath + "\n" + ex.ToString());
}
}
}
}
}