zoukankan      html  css  js  c++  java
  • C# XML文件操作类XmlHelper

    类的完整代码:

    using System;
    using System.Collections;
    using System.Xml;

    namespace Keleyi.Com.XmlDAL
    {
    public class XmlHelper
    {
    #region 公共变量
    XmlDocument xmldoc;
    XmlNode xmlnode;
    XmlElement xmlelem;
    #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
    {
    xmldoc = new XmlDocument();
    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;
    throw new Exception(e.Message);
    }
    }

    #endregion

    #region 常用操作方法(增删改)
    /// <summary>
    /// 插入一个节点和它的若干子节点
    /// </summary>
    /// <param name="XmlFile">Xml文件路径</param>
    /// <param name="NewNodeName">插入的节点名称</param>
    /// <param name="HasAttributes">此节点是否具有属性,True为有,False为无</param>
    /// <param name="fatherNode">此插入节点的父节点,要匹配的XPath表达式(例如:"//节点名//子节点名)</param>
    /// <param name="htAtt">此节点的属性,Key为属性名,Value为属性值</param>
    /// <param name="htSubNode">子节点的属性,Key为Name,Value为InnerText</param>
    /// <returns>返回真为更新成功,否则失败</returns>
    public bool InsertNode(string XmlFile, string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
    {
    try
    {
    xmldoc = new XmlDocument();
    xmldoc.Load(XmlFile);
    XmlNode root = xmldoc.SelectSingleNode(fatherNode);
    xmlelem = xmldoc.CreateElement(NewNodeName);
    if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性
    {
    SetAttributes(xmlelem, htAtt);
    SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText
    }
    else
    {
    SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点
    }

    root.AppendChild(xmlelem);
    xmldoc.Save(XmlFile);

    return true;
    }
    catch (Exception e)
    {

    throw new Exception(e.Message);

    }
    }
    /// <summary>
    /// 更新节点
    /// </summary>
    /// <param name="XmlFile">Xml文件路径</param>
    /// <param name="fatherNode">需要更新节点的上级节点,要匹配的XPath表达式(例如:"//节点名//子节点名)</param>
    /// <param name="htAtt">需要更新的属性表,Key代表需要更新的属性,Value代表更新后的值</param>
    /// <param name="htSubNode">需要更新的子节点的属性表,Key代表需要更新的子节点名字Name,Value代表更新后的值InnerText</param>
    /// <returns>返回真为更新成功,否则失败</returns>
    public bool UpdateNode(string XmlFile, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
    {
    try
    {
    xmldoc = new XmlDocument();
    xmldoc.Load(XmlFile);
    XmlNodeList root = xmldoc.SelectSingleNode(fatherNode).ChildNodes;
    UpdateNodes(root, htAtt, htSubNode);
    xmldoc.Save(XmlFile);
    return true;
    }
    catch (Exception e)
    {
    throw new Exception(e.Message);
    }
    }

    /// <summary>
    /// 删除指定节点下的子节点
    /// </summary>
    /// <param name="XmlFile">Xml文件路径</param>
    /// <param name="fatherNode">制定节点,要匹配的XPath表达式(例如:"//节点名//子节点名)</param>
    /// <returns>返回真为更新成功,否则失败</returns>
    public bool DeleteNodes(string XmlFile, string fatherNode)
    {
    try
    {
    xmldoc = new XmlDocument();
    xmldoc.Load(XmlFile);
    xmlnode = xmldoc.SelectSingleNode(fatherNode);
    xmlnode.RemoveAll();
    xmldoc.Save(XmlFile);
    return true;
    }
    catch (XmlException xe)
    {
    throw new XmlException(xe.Message);
    }
    }
    /*keleyi*/
    /// <summary>
    /// 删除匹配XPath表达式的第一个节点(节点中的子元素同时会被删除)
    /// </summary>
    /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
    /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
    /// <returns>成功返回true,失败返回false</returns>
    public bool DeleteXmlNodeByXPath(string xmlFileName, string xpath)
    {
    bool isSuccess = false;
    xmldoc = new XmlDocument();
    try
    {
    xmldoc.Load(xmlFileName); //加载XML文档
    XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
    if (xmlNode != null)
    {
    //删除节点
    xmldoc.ParentNode.RemoveChild(xmlNode);
    }
    xmldoc.Save(xmlFileName); //保存到XML文档
    isSuccess = true;
    }
    catch (Exception ex)
    {
    throw ex; //这里可以定义你自己的异常处理
    }
    return isSuccess;
    }

    /* keleyi.com */
    /// <summary>
    /// 删除匹配XPath表达式的第一个节点中的匹配参数xmlAttributeName的属性
    /// </summary>
    /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
    /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
    /// <param name="xmlAttributeName">要删除的xmlAttributeName的属性名称</param>
    /// <returns>成功返回true,失败返回false</returns>
    public bool DeleteXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName)
    {
    bool isSuccess = false;
    bool isExistsAttribute = false;
    xmldoc = new XmlDocument();
    try
    {
    xmldoc.Load(xmlFileName); //加载XML文档
    XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
    XmlAttribute xmlAttribute = null;
    if (xmlNode != null)
    {
    //遍历xpath节点中的所有属性
    foreach (XmlAttribute attribute in xmlNode.Attributes)
    {
    if (attribute.Name.ToLower() == xmlAttributeName.ToLower())
    {
    //节点中存在此属性
    xmlAttribute = attribute;
    isExistsAttribute = true;
    break;
    }
    }
    if (isExistsAttribute)
    {
    //删除节点中的属性
    xmlNode.Attributes.Remove(xmlAttribute);
    }
    }
    xmldoc.Save(xmlFileName); //保存到XML文档
    isSuccess = true;
    }
    catch (Exception ex)
    {
    throw ex; //这里可以定义你自己的异常处理
    }
    return isSuccess;
    }

    /*柯乐义*/
    /// <summary>
    /// 删除匹配XPath表达式的第一个节点中的所有属性
    /// </summary>
    /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
    /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
    /// <returns>成功返回true,失败返回false</returns>
    public bool DeleteAllXmlAttributeByXPath(string xmlFileName, string xpath)
    {
    bool isSuccess = false;
    xmldoc = new XmlDocument();
    try
    {
    xmldoc.Load(xmlFileName); //加载XML文档
    XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
    if (xmlNode != null)
    {
    //遍历xpath节点中的所有属性
    xmlNode.Attributes.RemoveAll();
    }
    xmldoc.Save(xmlFileName); //保存到XML文档
    isSuccess = true;
    }
    catch (Exception ex)
    {
    throw ex; //这里可以定义你自己的异常处理
    }
    return isSuccess;
    }
    #endregion

    #region 私有方法
    /// <summary>
    /// 设置节点属性
    /// </summary>
    /// <param name="xe">节点所处的Element</param>
    /// <param name="htAttribute">节点属性,Key代表属性名称,Value代表属性值</param>
    private void SetAttributes(XmlElement xe, Hashtable htAttribute)
    {
    foreach (DictionaryEntry de in htAttribute)
    {
    xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
    }
    }
    /// <summary>
    /// 增加子节点到根节点下
    /// </summary>
    /// <param name="rootNode">上级节点名称</param>
    /// <param name="XmlDoc">Xml文档</param>
    /// <param name="rootXe">父根节点所属的Element</param>
    /// <param name="SubNodes">子节点属性,Key为Name值,Value为InnerText值</param>
    private void SetNodes(string rootNode, XmlDocument XmlDoc, XmlElement rootXe, Hashtable SubNodes)
    {
    if (SubNodes == null)
    return;
    foreach (DictionaryEntry de in SubNodes)
    {
    xmlnode = XmlDoc.SelectSingleNode(rootNode);
    XmlElement subNode = XmlDoc.CreateElement(de.Key.ToString());
    subNode.InnerText = de.Value.ToString();
    rootXe.AppendChild(subNode);
    }
    }
    /// <summary>
    /// 更新节点属性和子节点InnerText值。柯 乐 义
    /// </summary>
    /// <param name="root">根节点名字</param>
    /// <param name="htAtt">需要更改的属性名称和值</param>
    /// <param name="htSubNode">需要更改InnerText的子节点名字和值</param>
    private 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 XML文档节点查询和读取
    /**/
    /// <summary>
    /// 选择匹配XPath表达式的第一个节点XmlNode.
    /// </summary>
    /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
    /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名")</param>
    /// <returns>返回XmlNode</returns>
    public XmlNode GetXmlNodeByXpath(string xmlFileName, string xpath)
    {
    xmldoc = new XmlDocument();
    try
    {
    xmldoc.Load(xmlFileName); //加载XML文档
    XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
    return xmlNode;
    }
    catch (Exception ex)
    {
    return null;
    //throw ex; //这里可以定义你自己的异常处理
    }
    }

    /**/
    /// <summary>
    /// 选择匹配XPath表达式的节点列表XmlNodeList.
    /// </summary>
    /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
    /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名")</param>
    /// <returns>返回XmlNodeList</returns>
    public XmlNodeList GetXmlNodeListByXpath(string xmlFileName, string xpath)
    {
    xmldoc = new XmlDocument();
    try
    {
    xmldoc.Load(xmlFileName); //加载XML文档
    XmlNodeList xmlNodeList = xmldoc.SelectNodes(xpath);
    return xmlNodeList;
    }
    catch (Exception ex)
    {
    return null;
    //throw ex; //这里可以定义你自己的异常处理
    }
    }

    /**/
    /// <summary>
    /// 选择匹配XPath表达式的第一个节点的匹配xmlAttributeName的属性XmlAttribute. 柯乐义
    /// </summary>
    /// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
    /// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
    /// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param>
    /// <returns>返回xmlAttributeName</returns>
    public XmlAttribute GetXmlAttribute(string xmlFileName, string xpath, string xmlAttributeName)
    {
    string content = string.Empty;
    xmldoc = new XmlDocument();
    XmlAttribute xmlAttribute = null;
    try
    {
    xmldoc.Load(xmlFileName); //加载XML文档
    XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
    if (xmlNode != null)
    {
    if (xmlNode.Attributes.Count > 0)
    {
    xmlAttribute = xmlNode.Attributes[xmlAttributeName];
    }
    }
    }
    catch (Exception ex)
    {
    throw ex; //这里可以定义你自己的异常处理
    }
    return xmlAttribute;
    }
    #endregion
    }
    }



    这个类怎么使用呢?下面给出一个创建xml文档的例子:
    XmlHelper m_menu_keleyi_com = new XmlHelper();
    m_menu_keleyi_com.CreateXmlDocument(@"D:kel"+"eyimenu.xml", "ke"+"leyimenu", "utf-8");

    这短代码在D盘创建了一个名为keleyimenu.xml的文档,文档有根节点keleyimenu,文档的内容为:
    <?xml version="1.0" encoding="utf-8"?>
    <keleyimenu />

    本篇则在上篇创建的xml文档中增加了节点。

    代码如下:

    XmlHelper m_menu_keleyi_com = new XmlHelper();
    Hashtable m_ht = new Hashtable();
    m_ht.Add("url", "http://keleyi.com/menu/csharp/");
    m_ht.Add("text", "C#");
    return m_menu_keleyi_com.InsertNode(@"D:kel" + "eyimenu.xml", "csharp", true, "keleyimenu", m_ht, null);

    当然需要引用命名空间:
    using Keleyi.Com.XmlDAL;

    结果xml文件keleyimenu.xml的内容为:

    <?xml version="1.0" encoding="utf-8"?>
    <keleyimenu>
    <csharp text="C#" url="http://keleyi.com/menu/csharp/" />
    </keleyimenu>

    上一篇已经在根节点下添加了节点csharp,现在来获取该节点,已经该节点的属性值。

    代码如下:

    string m_nodeName = "csharp";
    XmlNode m_menuNode_keleyi_com = m_menu_keleyi_com.GetXmlNodeByXpath(@"D:kel" + "eyimenu.xml", "//kele"+"yimenu//"+m_nodeName);
    string m_nodeText = m_menuNode_keleyi_com.Attributes["text"].Value;
    string m_nodeUrl = m_menuNode_keleyi_com.Attributes["url"].Value;

    那么现在m_nodeText的值为c#
    而m_nodeUrl的值为:http://keleyi.com/menu/csharp/

  • 相关阅读:
    888. Uncommon Words from Two Sentences
    344. Reverse String
    151. Reverse Words in a String
    557. Reverse Words in a String III
    811. Subdomain Visit Count
    上海市公积金、养老保险、医疗保险转出事宜
    476. Number Complement
    方法重载的条件
    简单工厂模式
    单例模式
  • 原文地址:https://www.cnblogs.com/aiqingqing/p/4421042.html
Copyright © 2011-2022 走看看