using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Collections;
using System.IO;
using System.Reflection;
namespace FrmUpdate
{
public class XmlHelper
{
/// <summary>--检查XML文件是否存在,不存在则先创建--
/// Guo Jin
/// </summary>
/// <param name="baseDirectory">文件完整目录</param>
/// <param name="fileName">文件名称</param>
/// <returns>真/假</returns>
private static bool CheckXmlFilesIsExists(string baseDirectory, string fileName)
{
bool isOk = true;
DirectoryInfo dir = null;
if (!Directory.Exists(baseDirectory))
{
try
{
dir = new DirectoryInfo(baseDirectory);
dir.Create();
}
catch (IOException ex)
{
isOk = false;
throw new Exception("创建" baseDirectory "失败:" ex.Message);
}
}
string filePath = baseDirectory "\\" fileName ".ini";
if (!File.Exists(filePath))
{
try
{
FileStream fs = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
string xmlHead = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" Environment.NewLine "<Items></Items>";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(xmlHead);
fs.Write(bytes, 0, bytes.Length);
fs.Flush();
fs.Close();
isOk = true;
}
catch (IOException ex)
{
isOk = false;
throw new Exception("创建" fileName "失败:" ex.Message);
}
}
return isOk;
}
/// <summary>--把业务数据保存为xml数据存储在本机--
/// Guo Jin
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="baseDir">程序启动路径</param>
/// <param name="baseDir">文件名称</param>
/// <param name="model">业务实体</param>
/// <returns>真\假</returns>
public static bool SaveAsXml<T>(string baseDir, string fileName, List<T> models)
{
bool result = false;
XmlDocument doc = null;
try
{
if (!CheckXmlFilesIsExists(baseDir, fileName))
{
return false;
}
doc = new XmlDocument();
doc.Load(baseDir @"\" fileName ".ini");
XmlNode root = doc.SelectSingleNode(@"//Items");//获取根节点
XmlElement element;//元素
XmlAttribute temp;//属性
PropertyInfo[] propinfos = null;
foreach (T obj in models)
{
if (models != null)
{
Type ty = obj.GetType();
propinfos = ty.GetProperties();//循环获取每个实体里面的所有属性。
}
element = doc.CreateElement(fileName);//为每个实体创建一个xml元素
foreach (PropertyInfo attb in propinfos)
{
temp = doc.CreateAttribute(attb.Name);
temp.Value = attb.GetValue(obj, null) == null ? "" : attb.GetValue(obj, null).ToString();
element.Attributes.Append(temp);
}
root.AppendChild(element);
}
doc.Save(baseDir @"\" fileName ".ini");
result = true;
}
catch (Exception ex)
{
result = false;
throw ex;
}
return result;
}
/// <summary>--根据条件到对应的Xml文件中检索数据
/// Guo Jin
/// </summary>
/// <param name="baseDirectory">文件完整目录</param>
/// <param name="fileName">Xml文件名</param>
/// <param name="condition">条件</param>
/// <param name="conditionValue">条件值</param>
/// <returns>XmlNodeList</returns>
public static XmlNodeList GetDataFromXml(string baseDirectory, string fileName, string condition, string conditionValue)
{
XmlNodeList list = null;
XmlDocument doc = null;
try
{
string pathTemp = "";
if (!string.IsNullOrEmpty(baseDirectory))
{
pathTemp = baseDirectory "\\" fileName ".ini";
}
if (File.Exists(pathTemp))
{
doc = new XmlDocument();
doc.Load(pathTemp);
string[] conditions = condition.Split(',');
string[] conditionValues = conditionValue.Split(',');
StringBuilder sb = new StringBuilder();
sb.Append(@"/Items/" fileName "[");
for (int i = 0; i < conditions.Length; i )
{
if (conditions.Length == 1)//如果就一个条件
{
sb.Append("@" conditions[i] "'" conditionValues[i] "' ");
}
else if (conditions.Length > 1 && i != (conditions.Length - 1))//如果是多个条件,并且不是最后一个
{
sb.Append("@" conditions[i] "'" conditionValues[i] "' and ");
}
else if (conditions.Length != 1 && i == (conditions.Length - 1))
{
sb.Append("@" conditions[i] "'" conditionValues[i] "' ");
}
}
sb.Append("]");
list = doc.SelectNodes(sb.ToString());
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return list;
}
/// <summary>--从xml文件中获取数据--
/// Guo Jin
/// </summary>
/// <param name="baseDirectory">文件完整目录</param>
/// <param name="fileName">文件名称</param>
/// <returns></returns>
public static XmlNodeList GetDataFromXml(string baseDirectory, string fileName)
{
XmlNodeList list = null;
XmlDocument doc = null;
try
{
string pathTemp = "";
if (!string.IsNullOrEmpty(baseDirectory))
{
pathTemp = baseDirectory "\\" fileName ".ini";
}
if (File.Exists(pathTemp))
{
doc = new XmlDocument();
doc.Load(pathTemp);
StringBuilder sb = new StringBuilder();
sb.Append(@"/Items/" fileName);
list = doc.SelectNodes(sb.ToString());
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return list;
}
/// <summary>--保存Xml文件--
/// Guo Jin
/// </summary>
/// <param name="baseDir">完整路径</param>
/// <param name="fileName">文件名称</param>
/// <param name="tab">要写入的Hashtable</param>
/// <returns>真/假</returns>
public static bool SaveAsXml(string baseDir, string fileName, Hashtable tab)
{
bool result = false;
XmlDocument doc = null;
try
{
if (!CheckXmlFilesIsExists(baseDir, fileName))
{
return false;
}
doc = new XmlDocument();
doc.Load(baseDir @"\" fileName ".ini");
XmlNode root = doc.SelectSingleNode(@"//Items");//获取根节点
XmlElement element;//元素
foreach (DictionaryEntry de in tab)
{
XmlNode node = doc.SelectSingleNode(@"//Items//" de.Key.ToString());
if (node == null)
{
//添加元素
element = doc.CreateElement(de.Key.ToString());
element.InnerText = de.Value.ToString();
root.AppendChild(element);
}
else
{
//修改元素值
node.InnerText = de.Value.ToString();
}
}
doc.Save(baseDir @"\" fileName ".ini");
result = true;
}
catch (Exception ex)
{
result = false;
throw ex;
}
return result;
}
/// <summary>--更新XML中某个元素的属性值--
/// Guo Jin
/// </summary>
/// <param name="filePath">xml文件的完整路径</param>
/// <param name="fileName">xml文件的名称,除去后缀名</param>
/// <param name="where">检索条件</param>
/// <param name="dis">要设置的元素的属性</param>
/// <param name="val">更新的值</param>
/// <returns>真/假</returns>
public static bool UpdateXml(string filePath, string fileName, string where, string dis, string val)
{
bool result = false;
XmlDocument doc = null;
try
{
if (File.Exists(filePath))
{
doc = new XmlDocument();
doc.Load(filePath);
XmlNode node = doc.SelectSingleNode(@"//Items//" fileName "[@" where "]");
if (node != null)
{
node.Attributes[dis].Value = val;
doc.Save(filePath);
result = true;
}
}
}
catch (Exception ex)
{
result = false;
throw ex;
}
return result;
}
/// <summary>--根据某元素的文本--
/// Guo Jin
/// </summary>
/// <param name="path">文件路径</param>
/// <param name="nodeName">元素名称</param>
/// <returns>该元素的Text</returns>
public static string GetXmlNodeText(string path, string nodeName)
{
XmlDocument doc = null;
try
{
doc = new XmlDocument();
doc.Load(path);
StringBuilder sb = new StringBuilder();
sb.Append(@"/Items/" nodeName);
XmlNode node = doc.SelectSingleNode(sb.ToString());
if (node != null)
{
return node.InnerText;
}
}
catch (Exception ex)
{
throw ex;
}
return "";
}
}
}