using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Reflection;
using System.IO;
using System.Diagnostics;
namespace Lhyi.Helper
{
/// <summary>
/// 對 XML 操作的輔助類
/// </summary>
public class XmlHelper
{
#region 常量
/// <summary>
/// XML文件的聲明
/// </summary>
public const string XML_STATEMENT = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
private const string NAME = "add";
private const string KEY = "key";
private const string VALUE = "value";
#endregion
#region 方法
/// <summary>
/// 通過文件地址加載Xml文件,獲取XmlDocument對象
/// </summary>
/// <param name="filePath">xml文件地址所在的系統目錄</param>
/// <param name="assemblyPath">文件所在的程序集地址[針對嵌入的資源]</param>
/// <returns>XmlDocument 對象</returns>
public static XmlDocument LoadXml(string filePath, string assemblyPath)
{
XmlDocument document = new XmlDocument();
try
{
if (File.Exists(filePath))
{
document.Load(filePath);
}
else
{
Assembly assembly = Assembly.GetEntryAssembly();
Stream stream = assembly.GetManifestResourceStream(assemblyPath);
document.Load(stream);
}
}
catch (Exception ex)
{
Debug.WriteLine("XmlHelper.LoadXml(string, string) :: " + ex.Message);
throw ex;
}
return document;
}
/// <summary>
/// 生成XML字符串
/// </summary>
/// <param name="root">根節點</param>
/// <param name="allNodes">所有的子節點</param>
/// <param name="allValues">所有子節點對應的數據</param>
/// <returns></returns>
public static string CreateXmlStr(string root, string[] allNodes, string[] allValues)
{
#region 拼接字符串
//StringBuilder sb = new StringBuilder();
//sb.Append("<" + headStr + ">");
//for (int i = 0; i < allNodes.Length; i++)
//{
// sb.Append("<" + allNodes[i] + ">" + allValues[i] + "</" + allNodes[i] + ">");
//}
//sb.Append("/" + headStr + ">");
//return sb.ToString();
#endregion
XmlDocument doc = new XmlDocument();
try
{
//添加xml文件的聲明
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(dec);
//添加根節點
XmlElement rootNode = doc.CreateElement(root);
doc.AppendChild(rootNode);
//添加子節點
for (int i = 0; i < allNodes.Length; i++)
{
XmlElement childNode = doc.CreateElement(allNodes[i]);
childNode.InnerText = allValues[i];
rootNode.AppendChild(childNode);
}
//doc.Save("\\demo.xml");
}
catch (Exception ex)
{
Debug.WriteLine("XmlHelper.CreateXmlStr(string, string[], string[]) :: " + ex.Message);
throw ex;
}
return doc.InnerXml;
}
/// <summary>
/// 返回對應的實體集合
/// 訪問的XML文件與之對應的 實體類 名稱必須大小寫一致,數據類型必須是String
/// 並且XML的編寫格式必須按要求編寫
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="document">XmlDocument對象</param>
/// <returns></returns>
public static List<T> Select<T>(XmlDocument document)
{
List<T> list = new List<T>();
XmlNode xmlRoot = document.DocumentElement;
if (xmlRoot != null)
{
T obj = default(T);
Type type = typeof(T);
PropertyInfo[] propertyInfos = type.GetProperties();
try
{
foreach (XmlNode xmlNode in xmlRoot.ChildNodes)
{
if (String.Compare(xmlNode.Name, type.Name, true) == 0)
{
obj = Activator.CreateInstance<T>();
foreach (PropertyInfo propertyInfo in propertyInfos)
{
String propertyName = propertyInfo.Name;//獲取屬性名稱
object value = xmlNode.Attributes[propertyName].Value;//從XML中得到該屬性的Value值
propertyInfo.SetValue(obj, value, null);//將得到的屬性值賦給obj對象
}
list.Add(obj);
}
}
}
catch (Exception ex)
{
Debug.WriteLine("XmlHelper.Select<T>(XmlDocument) :: " + ex.Message);
throw ex;
}
}
return list;
}
#endregion
}
}