using ProjectBase.Data.Encrypt;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;
namespace ProjectBase.Data.XML
{
///
/// XML序列号、反序列化、节点等操作类辅助类
///
public class XmlHelper
{
#region 变量
///
/// XML文件路径
///
protected string strXmlFile;
///
/// XmlDocument对象
///
protected XmlDocument objXmlDoc = new XmlDocument();
#endregion
///
/// 构造函数
///
/// XML文件路径
public XmlHelper(string XmlFile)
{
try
{
objXmlDoc.Load(XmlFile);
}
catch (System.Exception ex)
{
throw ex;
}
strXmlFile = XmlFile;
}
#region 静态方法
///
/// 二进制序列化
///
/// 文件路径
/// 对象实例
///
public static bool Serialize(string path, object obj)
{
try
{
using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
IFormatter format = new BinaryFormatter();
format.Serialize(stream, obj);
stream.Close();
}
return true;
}
catch
{
return false;
}
}
///
/// XML序列化
///
/// 文件路径
/// 对象实例
/// 对象类型
///
public static bool XmlSerialize(string path, object obj, Type type)
{
try
{
if (!File.Exists(path))
{
FileInfo fi = new FileInfo(path);
if (!fi.Directory.Exists)
{
Directory.CreateDirectory(fi.Directory.FullName);
}
}
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
XmlSerializer format = new XmlSerializer(type);
format.Serialize(stream, obj, ns);
stream.Close();
}
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
///
/// 二进制反序列化
///
/// 文件路径
///
public static object Deserialize(string path)
{
try
{
using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
IFormatter formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
object obj = formatter.Deserialize(stream);
stream.Close();
return obj;
}
}
catch
{
return null;
}
}
///
/// XML反序列化
///
/// 文件路径
/// 对象类型
///
public static object XmlDeserialize(string path, Type type)
{
try
{
using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
XmlSerializer formatter = new XmlSerializer(type);
stream.Seek(0, SeekOrigin.Begin);
object obj = formatter.Deserialize(stream);
stream.Close();
return obj;
}
}
catch
{
return null;
}
}
#endregion
#region 公用方法
///
/// 获取指定节点下面的XML子节点
///
/// XML节点
///
public XmlNodeList Read(string XmlPathNode)
{
try
{
XmlNode xn = objXmlDoc.SelectSingleNode(XmlPathNode);
return xn.ChildNodes;
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 读取节点属性内容
///
/// XML节点
/// 节点属性
///
public string Read(string XmlPathNode, string Attrib)
{
string value = "";
try
{
XmlNode xn = objXmlDoc.SelectSingleNode(XmlPathNode);
value = (Attrib.Equals("") ? xn.InnerText : xn.Attributes[Attrib].Value);
}
catch (Exception ex)
{
throw ex;
}
return value;
}
///
/// 获取元素节点对象
///
/// XML节点
/// 元素节点名称
///
public XmlElement GetElement(string XmlPathNode, string elementName)
{
XmlElement result = null;
XmlNode nls = objXmlDoc.SelectSingleNode(XmlPathNode);
foreach (XmlNode xn1 in nls)//遍历
{
XmlElement xe2 = (XmlElement)xn1;//转换类型
if (xe2.Name == elementName)//如果找到
{
result = xe2;
break;//找到退出来就可以了
}
}
return result;
}
///
/// 获取元素节点的值
///
/// XML节点
/// 元素节点名称
///
public string GetElementData(string XmlPathNode, string elementName)
{
string result = null;
XmlNode nls = objXmlDoc.SelectSingleNode(XmlPathNode);
foreach (XmlNode xn1 in nls)//遍历
{
XmlElement xe2 = (XmlElement)xn1;//转换类型
if (xe2.Name == elementName)//如果找到
{
result = xe2.InnerText;
break;//找到退出来就可以了
}
}
return result;
}
///
/// 获取节点下的DataSet
///
/// XML节点
///
public DataSet GetData(string XmlPathNode)
{
DataSet ds = new DataSet();
StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml);
ds.ReadXml(read);
return ds;
}
///
/// 替换某节点的内容
///
/// XML节点
/// 节点内容
public void Replace(string XmlPathNode, string Content)
{
objXmlDoc.SelectSingleNode(XmlPathNode).InnerText = Content;
}
///
/// 删除节点
///
/// 节点
public void Delete(string Node)
{
string mainNode = Node.Substring(0, Node.LastIndexOf("/"));
objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node));
}
///
/// 插入一节点和此节点的一子节点
///
///
///
///
///
public void InsertNode(string MainNode, string ChildNode, string Element, string Content)
{
XmlNode objRootNode = objXmlDoc.SelectSingleNode(MainNode);
XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode);
objRootNode.AppendChild(objChildNode);
XmlElement objElement = objXmlDoc.CreateElement(Element);
objElement.InnerText = Content;
objChildNode.AppendChild(objElement);
}
///
/// 插入一个节点带一个属性
///
/// 指定的XML节点
/// 元素名称
/// 属性名称
/// 属性值
/// 内容
public void InsertElement(string MainNode, string Element, string Attrib, string AttribContent, string Content)
{
XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
XmlElement objElement = objXmlDoc.CreateElement(Element);
objElement.SetAttribute(Attrib, AttribContent);
objElement.InnerText = Content;
objNode.AppendChild(objElement);
}
///
/// 插入XML元素
///
/// 指定的XML节点
/// 元素名称
/// 内容
public void InsertElement(string MainNode, string Element, string Content)
{
XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode);
XmlElement objElement = objXmlDoc.CreateElement(Element);
objElement.InnerText = Content;
objNode.AppendChild(objElement);
}
///
/// 保存XML文档
///
public void Save()
{
try
{
objXmlDoc.Save(strXmlFile);
}
catch (System.Exception ex)
{
throw ex;
}
objXmlDoc = null;
}
///
/// XML序列化并对文件进行加密
///
/// 文件路径
/// 对象实例
/// 对象类型
///
public bool XmlSerializeEncrypt(string path, object obj, Type type)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
try
{
if (!File.Exists(path))
{
FileInfo fi = new FileInfo(path);
if (!fi.Directory.Exists)
{
Directory.CreateDirectory(fi.Directory.FullName);
}
}
using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
string content = "";
using (MemoryStream ms = new MemoryStream())
{
XmlSerializer format = new XmlSerializer(type);
format.Serialize(ms, obj, ns);
ms.Seek(0, 0);
content = Encoding.ASCII.GetString(ms.ToArray());
}
string encrypt = EncodeHelper.EncryptString(content);
byte[] bytes = UTF8Encoding.Default.GetBytes(encrypt);
stream.Write(bytes, 0, bytes.Length);
stream.Close();
}
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
///
/// XML反序列化并解密
///
/// 文件路径
/// 对象类型
///
public object XmlDeserializeDecrypt(string path, Type type)
{
try
{
string encrypt = File.ReadAllText(path, Encoding.UTF8);
string content = EncodeHelper.DecryptString(encrypt, true);
byte[] bytes = UTF8Encoding.Default.GetBytes(content);
using (MemoryStream stream = new MemoryStream(bytes))
{
XmlSerializer formatter = new XmlSerializer(type);
stream.Seek(0, SeekOrigin.Begin);
object obj = formatter.Deserialize(stream);
stream.Close();
return obj;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
#endregion
}
}