- 浏览: 244017 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
yulanlian:
...
实现在删除数据后,自增列的值连续 -
RonQi:
楼主写的很好,支持原创!
Google Protocol Buffers
首先,看下这个XmlHelper类库的结构,如下图:
然后,在Vs中新建一个解决方案,叫做XMLHelper,添加一个C# 类库项目XMLHelper,重命名Class1.cs为XmlHelper.cs。
再为XmlHelper.cs添加
using System.Collections;
using System.Xml;
这两个引用保证了我们可以使用XML的大部分功能和哈希表.
主要的代码如下:
namespace XMLHelper { 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">此插入节点的父节点</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">需要更新节点的上级节点</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">制定节点</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); } } #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) { 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 } } 文章来自学IT网:http://www.xueit.com/html/2009-08/21_4275_00.html
下面讲解此类:
1、插入节点函数中的两个哈希表说明:
a.htAtt:用于存储了节点属性的哈希表,表中的Key对应了节点的属性名称,如<Fan Nickname="Jacky">这里的Nickname就是哈希表中的Key值,而Jacky就对应哈希表中的Value值,这样,你可以在插入节点前,把该节点的属性(多个)名称和对应的值先存入哈希表中,然后再传给函数即可增加多个属性。
b.htSubNode:存储了子节点的数据,子节点包括他的名字和InnerText值,如<Age>23</Age>这里的Age就是子节点名字,23就是节点的InnerText值。
2、修改节点函数中的哈希表说明:
a.htAtt:存储了待更新的属性值,传入函数后,函数将逐一对比,查看节点中是否含有htAtt的Key值,如果含有,则表明节点的该属性的值(Value)将被htAtt中相应的Value替换。
b.htSubNode:存储了子节点的修改信息,传入函数后,函数将逐一对比,查看子节点的节点名字是否含有htSubNode的Key值,如果含有,则表明此子节点需要被更新,则此节点的InnerText将被修改为相应的htSubNode的Value值。
好了,下面我们来看看类库运行起来的效果吧:
一、先创建Xml文件,如下:
我们来这个路径下,打开刚才创建的xml文档,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<AppSettings/>
二、执行插入节点操作,如下图:(插入的节点数据在程序中,请稍候在本文尾部下载)
我们再打开这个文件,看看插入效果和程序中的一样么:
<?xml version="1.0" encoding="utf-8"?> <AppSettings> <Fan Nickname="Jacky"> <Age>23</Age> </Fan> </AppSettings>
三、我们修改一下节点内容:
修改效果如下:
<?xml version="1.0" encoding="utf-8"?> <AppSettings> <Fan Nickname="Doggy"> <Age>3</Age> </Fan> </AppSettings>
四、好了,删除刚才的那些节点吧:
又变回原样了:
<?xml version="1.0" encoding="utf-8"?> <AppSettings/>
OK,这就是这个Helper的主要功能,你可以重载一些函数,增加它的功能,让它更加健壮,这回我就多了个帮手了,呵呵,可以根据自己需求更改,以后就不怕写Xml了,当然,你也可以把它移植到移动项目中,同样可行,只是到时候请注意路径问题,最好使用绝对路径!
文章来自学IT网:http://www.xueit.com/cshare/show-4275-2.aspx
发表评论
-
win7和VS2010下配置OpenGL的方法
2011-01-15 23:45 6405刚装了win7和VS2010。看了下配置OpenGL的方法和以 ... -
用好ASP.NET 2.0的URL映射
2010-12-06 08:31 756简介: URL映射是ASP.NET 2.0中提供的 ... -
.NET加密技术应用
2010-12-06 08:20 768using System; using System. ... -
加密web.config中数据参数的信息
2010-12-06 08:17 823我们都知道web.config可以保存连接字符串, ... -
主题:ASP.NET加上水印
2010-12-02 19:56 806为我们发布的图片加上一个水印,也是我们经常要做的事情,那怎 ... -
asp.net 2.0 读写配置文件
2010-12-01 11:13 1102下面我给出一个简单的例子说明如何使用WebConf ... -
ASP.NET配置文件的读、写操作
2010-12-01 11:03 1314虽然web.config文件是一个XML文件,但是由于权限的原 ... -
使用aspx实现发送email
2010-11-28 22:08 732源代码如下:using System; using Syst ... -
未能加载文件或程序集system.web.extensions解决方法
2010-11-27 09:40 1630未能加载文件或程序集system.web.extensions ... -
asp.net根据域名查ip C#版
2010-10-31 17:04 998网上有类似的教程,但是是asp.net 1.1的版本,这是本人 ... -
如何构造一个C#语言的爬虫程序
2010-10-31 17:03 858C#特别适合于构造蜘蛛 ... -
C#代码与javaScript函数的相互调用
2010-10-31 16:55 1113C#代码与javaScript函数的相互调用 我们通过问答 ... -
C#知识点总结_委托篇
2010-10-30 18:10 622C#知识点总结1——委托篇 1.委托概念: 当要把方法传 ... -
调用Windows API
2010-10-30 18:04 998在.Net Framework SDK文档中 ... -
C#中正确的调用API函数
2010-10-30 18:02 993在C#中经常需要调用一些API函数,那么怎样才能正确的调用AP ... -
用C#和本地Windows API操纵系统菜单
2010-10-30 18:00 1518一、前言 .NET框架是Windows应用领域中一个非常新 ... -
.NET(C#)连接各类数据库代码-集锦
2010-09-05 07:59 12911.C#连接连接Access using System.Da ... -
C#调用rar.exe解压一个rar文件到系统的临时目录
2010-08-31 00:04 1878//取得系统临时目录 string sysTempDir = ... -
C#实现winform软件开机自动启动并最小化到系统托盘
2010-08-31 00:01 4433一、开机自动启动: 拖一个CheckBox 1、软件启动时 ... -
C#里面比较时间大小三种方法收藏
2010-08-30 23:56 12781.比较时间大小的实验 string st1 ...
相关推荐
本篇文章将详细探讨一个高效的C# XML文件生成类,名为`XmlHelper`。 `XmlHelper.cs` 文件包含了一个自定义的类,该类提供了简洁且强大的API来生成XML文件。以下是一些关键功能和知识点: 1. **创建XML文档对象**:...
这个例子展示了如何利用`XmlHelper`类在ASP.NET中高效地读取和解析XML文件。在实际项目中,可以根据需求扩展这个类,添加更多功能,如XML序列化和反序列化、XML验证等。通过封装这些常用操作,可以使代码更加整洁,...
2. **实现XML操作方法**:在`XMLHelper`类中,为每个操作编写一个静态方法,如`ReadConnectionString`,`AddConnectionString`,`UpdateConnectionString`和`RemoveConnectionString`。确保这些方法接受必要的参数,...
标题提到的是"C#三层登录例子,开发框架",这表明这是一个使用C#编程语言构建的登录系统示例,它采用了三层架构设计模式。三层架构是一种常见的软件设计模式,通常包括表现层(UI)、业务逻辑层(BLL)和数据访问层...
这个例子展示了如何在全局类`XmlHelper`中使用DOM方式读取和保存XML文件。 7. 注意事项: - XML解析和操作时要处理可能出现的异常,例如文件不存在、解析错误等。 - 考虑到性能,大型XML文件更适合使用SAX解析器。 ...
首先,通过`xmlHelper.GetXmlElement`方法获取XML文件的根元素,然后遍历其子元素,为每个子元素创建一个`ToolStripMenuItem`实例。`ToolStripMenuItem`的文本属性设置为XML元素的"descript"属性值,然后将其添加到`...
XmlHelper XMLProcess 12.弹出消息类 MessageBox ShowMessageBox 13.导出Excel 操作类 DataToExcel ExcelHelper ExportExcel GridViewExport 14.分词辅助类 SegList 15.汉字转拼音 EcanConvertToCh PinYin 16.配置...
XmlHelper 操作Xml文档的帮助类,主要是添加,删除,修改,查询节点的操作和操作后进行保存的功能。 XMLProcess 操作Xml文档的帮助类,主要是添加,删除,修改,查询节点的操作的功能。 12.弹出消息类 MessageBox...
XmlHelper 操作Xml文档的帮助类,主要是添加,删除,修改,查询节点的操作和操作后进行保存的功能。 XMLProcess 操作Xml文档的帮助类,主要是添加,删除,修改,查询节点的操作的功能。 12.弹出消息类 MessageBox...
为了简化这个过程,可以考虑使用记录的类助手(Class Helper)来提供额外的功能,如JSON或XML序列化。这样,Record类型可以方便地在不同层之间以字符串形式传递,然后在接收端反序列化回Record。 总的来说,传递...
描述中提到的“Helper类”通常是指一个自定义的辅助类,它封装了调用WebService的相关逻辑,使得在其他项目中可以方便地复用这些功能。这种设计模式有助于提高代码的可维护性和可重用性。 首先,让我们了解动态调用...
传统的命令式编程方式(如C#)往往需要编写大量的循环和条件判断来实现复杂的数据过滤和操作,而SQL这样的声明式语言则允许开发者直接描述想要的结果,而不必关心如何实现。然而,将SQL的便利性引入到C#这样的强类型...
以下是`XmlArgs`类的C#实现: ```csharp public class XmlArgs { private string _strArgs = string.Empty; private bool _isCreate = false; private Dictionary, string> _args; public string Args { get...