C#操作xml文檔的通用類

pw36 9年前發布 | 1K 次閱讀 C#

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Collections;
using System.IO;
using Corporation.DAL;

/// <summary> /// XML操作: /// 參照手冊http://www.w3school.com.cn/xpath/xpath_operators.asp /// </summary> public class XMLHealper {

#region 構造函數
public XMLHealper()
{
    FilePath = XMLPath.GetXMLPath();
    OpenXML();
}
#endregion

#region 對象定義

private XmlDocument xmlDoc = new XmlDocument();
XmlNode xmlnode;
XmlElement xmlelem;

#endregion

#region 屬性定義

private string errorMess;
public string ErrorMess
{
    get { return errorMess; }
    set { errorMess = value; }
}

private string filePath;
public string FilePath
{
    set { filePath = value; }
    get { return filePath; }
}

#endregion

#region 創建XML操作對象
/// <summary>
/// 創建XML操作對象
/// </summary>
public void OpenXML()
{
    try
    {
        if (!string.IsNullOrEmpty(FilePath))
        {
            xmlDoc.Load(filePath);
        }
        else
        {
            FilePath = string.Format(@"E:\log4net.xml"); //默認路徑
            xmlDoc.Load(filePath);
        }
    }
    catch (Exception ex)
    {
        ErrorMess = ex;
    }
}
#endregion

#region 創建Xml 文檔
/// <summary>
/// 創建一個帶有根節點的Xml 文件
/// </summary>
/// <param name="FileName">Xml 文件名稱</param>
/// <param name="rootName">根節點名稱</param>
/// <param name="Encode">編碼方式:gb2312,UTF-8 等常見的</param>
/// <param name="DirPath">保存的目錄路徑</param>
/// <returns></returns>
public bool CreatexmlDocument(string FileName, string rootName, string Encode)
{
    try
    {
        XmlDeclaration xmldecl;
        xmldecl = xmlDoc.CreateXmlDeclaration("1.0", Encode, null);
        xmlDoc.AppendChild(xmldecl);
        xmlelem = xmlDoc.CreateElement("", rootName, "");
        xmlDoc.AppendChild(xmlelem);
        xmlDoc.Save(FileName);
        return true;
    }
    catch (Exception e)
    {
        return false;
    }
}
#endregion

//獲取值

#region 得到表
/// <summary>
/// 得到表
/// </summary>
/// <returns></returns>
public DataView GetData()
{
    xmlDoc = new XmlDocument();
    DataSet ds = new DataSet();
    StringReader read = new StringReader(xmlDoc.SelectSingleNode(FilePath).OuterXml);
    ds.ReadXml(read);
    return ds.Tables[0].DefaultView;
}
#endregion

#region 讀取指定節點的指定屬性值
/// <summary>
/// 功能:
/// 讀取指定節點的指定屬性值
/// </summary>
/// <param name="strNode">節點名稱(相對路徑://+節點名稱)</param>
/// <param name="strAttribute">此節點的屬性</param>
/// <returns></returns>
public string GetXmlNodeValue(string strNode, string strAttribute)
{
    string strReturn = "";
    try
    {
        //根據指定路徑獲取節點
        XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
        //獲取節點的屬性,并循環取出需要的屬性值
        XmlAttributeCollection xmlAttr = xmlNode.Attributes;

        for (int i = 0; i < xmlAttr.Count; i++)
        {
            if (xmlAttr.Item(i).Name == strAttribute)
            {
                strReturn = xmlAttr.Item(i).Value;
            }
        }
    }
    catch (XmlException xmle)
    {
        throw xmle;
    }
    return strReturn;
}
#endregion

#region 讀取指定節點的值
/// <summary>
/// 功能:
/// 讀取指定節點的值
/// </summary>
/// <param name="strNode">節點名稱</param>
/// <returns></returns>
public string GetXmlNodeValue(string strNode)
{
    string strReturn = String.Empty;
    try
    {
        //根據路徑獲取節點
        XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
        strReturn = xmlNode.InnerText;
    }
    catch (XmlException xmle)
    {
        System.Console.WriteLine(xmle.Message);
    }
    return strReturn;
}
#endregion

#region 獲取XML文件的根元素
/// <summary>
/// 獲取XML文件的根元素
/// </summary>
public XmlNode GetXmlRoot()
{
    return xmlDoc.DocumentElement;
}
#endregion

#region 獲取XML節點值
/// <summary>
/// 獲取XML節點值
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public string GetNodeValue(string nodeName)
{
    xmlDoc = new XmlDocument();
    xmlDoc.Load(FilePath);

    XmlNodeList xnl = xmlDoc.ChildNodes;
    foreach (XmlNode xnf in xnl)
    {
        XmlElement xe = (XmlElement)xnf;
        XmlNodeList xnf1 = xe.ChildNodes;
        foreach (XmlNode xn2 in xnf1)
        {
            if (xn2.InnerText == nodeName)
            {
                XmlElement xe2 = (XmlElement)xn2;
                return xe2.GetAttribute("value");
            }
        }
    }
    return null;
}
#endregion

//添加或插入

#region 設置節點值
/// <summary>
/// 功能:
/// 設置節點值
/// </summary>
/// <param name="strNode">節點的名稱</param>
/// <param name="newValue">節點值</param>
public void SetXmlNodeValue(string xmlNodePath, string xmlNodeValue)
{
    try
    {
        //根據指定路徑獲取節點
        XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
        //設置節點值
        xmlNode.InnerText = xmlNodeValue;
    }
    catch (XmlException xmle)
    {
        throw xmle;
    }
}
#endregion

#region 添加父節點

/// <summary>
/// 在根節點下添加父節點
/// </summary>
public void AddParentNode(string parentNode)
{
    XmlNode root = GetXmlRoot();
    XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode);

    root.AppendChild(parentXmlNode);
}
#endregion

#region 向一個已經存在的父節點中插入一個子節點
/// <summary>
/// 向一個已經存在的父節點中插入一個子節點
/// </summary>
public void AddChildNode(string parentNodePath, string childNodePath)
{
    XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath);
    XmlNode childXmlNode = xmlDoc.CreateElement(childNodePath);

    parentXmlNode.AppendChild(childXmlNode);
}
#endregion

#region 向一個節點添加屬性
/// <summary>
/// 向一個節點添加屬性
/// </summary>
public void AddAttribute(string NodePath, string NodeAttribute)
{
    XmlAttribute nodeAttribute = xmlDoc.CreateAttribute(NodeAttribute);
    XmlNode nodePath = xmlDoc.SelectSingleNode(NodePath);
    nodePath.Attributes.Append(nodeAttribute);
}
#endregion

#region 插入一個節點和它的若干子節點
/// <summary>
/// 插入一個節點和它的若干子節點
/// </summary>
/// <param name="NewNodeName">插入的節點名稱</param>
/// <param name="HasAttributes">此節點是否具有屬性,True 為有,False 為無</param>
/// <param name="fatherNode">此插入節點的父節點</param>
/// <param name="htAtt">此節點的屬性,Key 為屬性名,Value 為屬性值</param>
/// <param name="htSubNode"> 子節點的屬性, Key 為Name,Value 為InnerText</param>
/// <returns>返回真為更新成功,否則失敗</returns>
public bool InsertNode(string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
    try
    {
        xmlDoc.Load(FilePath);
        XmlNode root = xmlDoc.SelectSingleNode(fatherNode);
        xmlelem = xmlDoc.CreateElement(NewNodeName);
        if (htAtt != null && HasAttributes)//若此節點有屬性,則先添加屬性
        {
            SetAttributes(xmlelem, htAtt);
            AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//添加完此節點屬性后,再添加它的子節點和它們的InnerText
        }
        else
        {
            AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//若此節點無屬性,那么直接添加它的子節點
        }
        root.AppendChild(xmlelem);
        xmlDoc.Save(FilePath);
        return true;
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}
#endregion

#region 設置節點屬性
/// <summary>
/// 設置節點屬性
/// </summary>
/// <param name="xe">節點所處的Element</param>
/// <param name="htAttribute">節點屬性,Key 代表屬性名稱,Value 代表屬性值</param>
public void SetAttributes(XmlElement xe, Hashtable htAttribute)
{
    foreach (DictionaryEntry de in htAttribute)
    {
        xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
    }
}
#endregion

#region 增加子節點到根節點下
/// <summary>
/// 增加子節點到根節點下
/// </summary>
/// <param name="rootNode">上級節點名稱</param>
/// <param name="xmlDoc">Xml 文檔</param>
/// <param name="rootXe">父根節點所屬的Element</param>
/// <param name="SubNodes">子節點屬性,Key 為Name 值,Value 為InnerText 值</param>
public void AddNodes(string rootNode, XmlDocument xmlDoc, XmlElement rootXe, Hashtable SubNodes)
{
    foreach (DictionaryEntry de in SubNodes)
    {
        xmlnode = xmlDoc.SelectSingleNode(rootNode);
        XmlElement subNode = xmlDoc.CreateElement(de.Key.ToString());
        subNode.InnerText = de.Value.ToString();
        rootXe.AppendChild(subNode);
    }
}
#endregion

//更新

#region 設置節點的屬性值
/// <summary>
/// 功能:
/// 設置節點的屬性值
/// </summary>
/// <param name="xmlNodePath">節點名稱</param>
/// <param name="xmlNodeAttribute">屬性名稱</param>
/// <param name="xmlNodeAttributeValue">屬性值</param>
public void SetXmlNodeValue(string xmlNodePath, string xmlNodeAttribute, string xmlNodeAttributeValue)
{
    try
    {
        //根據指定路徑獲取節點
        XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);

        //獲取節點的屬性,并循環取出需要的屬性值
        XmlAttributeCollection xmlAttr = xmlNode.Attributes;
        for (int i = 0; i < xmlAttr.Count; i++)
        {
            if (xmlAttr.Item(i).Name == xmlNodeAttribute)
            {
                xmlAttr.Item(i).Value = xmlNodeAttributeValue;
                break;
            }
        }
    }
    catch (XmlException xmle)
    {
        throw xmle;
    }
}

#endregion

#region 更新節點
/// <summary>
/// 更新節點
/// </summary>
/// <param name="fatherNode">需要更新節點的上級節點</param>
/// <param name="htAtt">需要更新的屬性表,Key 代表需要更新的屬性,Value 代表更新后的值</param>
/// <param name="htSubNode">需要更新的子節點的屬性表,Key 代表需要更新的子節點名字Name,Value 代表更新后的值InnerText</param>
/// <returns>返回真為更新成功,否則失敗</returns>
public bool UpdateNode(string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
    try
    {
        xmlDoc = new XmlDocument();
        xmlDoc.Load(FilePath);
        XmlNodeList root = xmlDoc.SelectSingleNode(fatherNode).ChildNodes;
        UpdateNodes(root, htAtt, htSubNode);
        xmlDoc.Save(FilePath);
        return true;
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}
#endregion

#region 更新節點屬性和子節點InnerText 值
/// <summary>
/// 更新節點屬性和子節點InnerText 值
/// </summary>
/// <param name="root">根節點名字</param>
/// <param name="htAtt">需要更改的屬性名稱和值</param>
/// <param name="htSubNode">需要更改InnerText 的子節點名字和值</param>
public void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
{
    foreach (XmlNode xn in root)
    {
        xmlelem = (XmlElement)xn;
        if (xmlelem.HasAttributes)//如果節點如屬性,則先更改它的屬性
        {
            foreach (DictionaryEntry de in htAtt)//遍歷屬性哈希表
            {
                if (xmlelem.HasAttribute(de.Key.ToString()))//如果節點有需要更改的屬性
                {
                    xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//則把哈希表中相應的值Value 賦給此屬性Key
                }
            }
        }
        if (xmlelem.HasChildNodes)//如果有子節點,則修改其子節點的InnerText
        {
            XmlNodeList xnl = xmlelem.ChildNodes;
            foreach (XmlNode xn1 in xnl)
            {
                XmlElement xe = (XmlElement)xn1;
                foreach (DictionaryEntry de in htSubNode)
                {
                    if (xe.Name == de.Key.ToString())//htSubNode 中的key 存儲了需要更改的節點名稱,
                    {
                        xe.InnerText = de.Value.ToString();//htSubNode中的Value存儲了Key 節點更新后的數據
                    }
                }
            }
        }
    }
}
#endregion

//刪除

#region 刪除一個節點的屬性
/// <summary>
/// 刪除一個節點的屬性
/// </summary>
public void DeleteAttribute(string NodePath, string NodeAttribute, string NodeAttributeValue)
{
    XmlNodeList nodePath = xmlDoc.SelectSingleNode(NodePath).ChildNodes;

    foreach (XmlNode xn in nodePath)
    {
        XmlElement xe = (XmlElement)xn;

        if (xe.GetAttribute(NodeAttribute) == NodeAttributeValue)
        {
            xe.RemoveAttribute(NodeAttribute);//刪除屬性
        }
    }
}

#endregion

#region 刪除一個節點
/// <summary>
/// 刪除一個節點
/// </summary>
public void DeleteXmlNode(string tempXmlNode)
{
    XmlNode xmlNodePath = xmlDoc.SelectSingleNode(tempXmlNode);
    xmlNodePath.ParentNode.RemoveChild(xmlNodePath);
}

#endregion

#region 刪除指定節點下的子節點
/// <summary>
/// 刪除指定節點下的子節點
/// </summary>
/// <param name="fatherNode">制定節點</param>
/// <returns>返回真為更新成功,否則失敗</returns>
public bool DeleteNodes(string fatherNode)
{
    try
    {
        xmlDoc = new XmlDocument();
        xmlDoc.Load(FilePath);
        xmlnode = xmlDoc.SelectSingleNode(fatherNode);
        xmlnode.RemoveAll();
        xmlDoc.Save(FilePath);
        return true;
    }
    catch (XmlException xe)
    {
        throw new XmlException(xe.Message);
    }
}
#endregion

//內部函數與保存

#region 私有函數

private string functionReturn(XmlNodeList xmlList, int i, string nodeName)
{
    string node = xmlList[i].ToString();
    string rusultNode = "";
    for (int j = 0; j < i; j++)
    {
        if (node == nodeName)
        {
            rusultNode = node.ToString();
        }
        else
        {
            if (xmlList[j].HasChildNodes)
            {
                functionReturn(xmlList, j, nodeName);
            }
            else
            {
                break;
            }
        }
    }
    return rusultNode;


}

#endregion

#region 保存XML文件
/// <summary>
/// 功能: 
/// 保存XML文件
/// 
/// </summary>
public void SavexmlDocument()
{
    try
    {
        xmlDoc.Save(FilePath);
    }
    catch (XmlException xmle)
    {
        throw xmle;
    }
}
/// <summary>
/// 功能: 保存XML文件
/// </summary>
/// <param name="tempXMLFilePath"></param>
public void SavexmlDocument(string tempXMLFilePath)
{
    try
    {
        xmlDoc.Save(tempXMLFilePath);
    }
    catch (XmlException xmle)
    {
        throw xmle;
    }
}
#endregion

} </pre>

 本文由用戶 pw36 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!