C#操作xml完整类文件 xml_oper.cs using ...System; using System.Data; using System.Web; using System.Xml; /**/ /// summary /// 类名:xml操作类 /// 作者:虫 /// 时间:2008.8.31 /// /summary public class xml_oper...{ private XmlDo
C#操作xml完整类文件
xml_oper.cs using ...System; using System.Data; using System.Web; using System.Xml; /**//// <summary> /// 类名:xml操作类 /// 作者:虫 /// 时间:2008.8.31 /// </summary> public class xml_oper ...{ private XmlDocument xmlDoc; public xml_oper() ...{ } /**//// <summary> /// 加载xml文件 /// </summary> /// <param name="path">xml文件的物理路径</param> private void LoadXml(string path, string node_root) ...{ xmlDoc = new XmlDocument(); //判断xml文件是否存在 if (!System.IO.File.Exists(path)) ...{ //创建xml 声明节点 XmlNode xmlnode = xmlDoc.CreateNode(System.Xml.XmlNodeType.XmlDeclaration, "", ""); //添加上述创建和 xml声明节点 xmlDoc.AppendChild(xmlnode); //创建xml dbGuest 元素(根节点) XmlElement xmlelem = xmlDoc.CreateElement("", node_root, ""); xmlDoc.AppendChild(xmlelem); try ...{ xmlDoc.Save(path); } catch (Exception ex) ...{ throw ex; } xmlDoc.Load(path); } else ...{ //加载xml文件 xmlDoc.Load(path); } } /**//// <summary> /// 添加xml子节点 /// </summary> /// <param name="path">xml文件的物理路径</param> /// <param name="node_root">根节点名称</param> /// <param name="node_name">添加的子节点名称</param> /// <param name="node_text">子节点文本</param> public void addElement(string path, string node_root, string node_name, string node_text,string att_name,string att_value) ...{ LoadXml(path, node_root); XmlNodeList nodeList = xmlDoc.SelectSingleNode(node_root).ChildNodes;//获取bookstore节点的所有子节点 //判断是否有节点,有节点就遍历所有子节点,看看有没有重复节点,没节点就添加一个新节点 if (nodeList.Count > 0) ...{ foreach (XmlNode xn in nodeList)//遍历所有子节点 ...{ XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 if (xe.GetAttribute(att_name) != att_value) ...{ XmlNode xmldocSelect = xmlDoc.SelectSingleNode(node_root); //选中根节点 XmlElement son_node = xmlDoc.CreateElement(node_name); //添加子节点 son_node.SetAttribute(att_name, att_value); //设置属性 son_node.InnerText = node_text; //添加节点文本 xmldocSelect.AppendChild(son_node); //添加子节点 xmlDoc.Save(path); //保存xml文件 break; } } } else ...{ XmlNode xmldocSelect = xmlDoc.SelectSingleNode(node_root); //选中根节点 XmlElement son_node = xmlDoc.CreateElement(node_name); //添加子节点 son_node.SetAttribute(att_name, att_value); //设置属性 son_node.InnerText = node_text; //添加节点文本 xmldocSelect.AppendChild(son_node); //添加子节点 xmlDoc.Save(path); //保存xml文件 } } /**//// <summary> /// 修改节点的内容 /// </summary> /// <param name="path">xml文件的物理路径</param> /// <param name="node_root">根节点名称</param> /// <param name="new_text">节点的新内容</param> /// <param name="att_name">节点的属性名</param> /// <param name="att_value">节点的属性值</param> public void UpdateElement(string path, string node_root, string new_text, string att_name, string att_value) ...{ LoadXml(path, node_root); XmlNodeList nodeList = xmlDoc.SelectSingleNode(node_root).ChildNodes;//获取bookstore节点的所有子节点 foreach (XmlNode xn in nodeList)//遍历所有子节点 ...{ XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 if (xe.GetAttribute(att_name) == att_value) ...{ xe.InnerText = new_text; //内容赋值 xmlDoc.Save(path);//保存 break; } } } /**//// <summary> /// 删除节点 /// </summary> /// <param name="path">xml文件的物理路径</param> /// <param name="node_root">根节点名称</param> /// <param name="att_name">节点的属性名</param> /// <param name="att_value">节点的属性值</param> public void deleteNode(string path, string node_root, string att_name, string att_value) ...{ LoadXml(path, node_root); XmlNodeList nodeList = xmlDoc.SelectSingleNode(node_root).ChildNodes; XmlNode root = xmlDoc.SelectSingleNode(node_root); foreach (XmlNode xn in nodeList) ...{ XmlElement xe = (XmlElement)xn; if (xe.GetAttribute(att_name) == att_value) ...{ //xe.RemoveAttribute("name");//删除name属性 xe.RemoveAll();//删除该节点的全部内容 root.RemoveChild(xe); xmlDoc.Save(path);//保存 break; } } } }View Code
C#解析XML基础
(转) C#解析XML基础 用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。 已知有一个XML文件(bookstore.xml)如下: 1 <?xml version="1.0" encoding="gb2312"?> 2 <bookstore> 3 <book genre="fantasy" ISBN="2-3631-4"> 4 <title>Oberon‘s Legacy</title> 5 <author>Corets, Eva</author> 6 <price>5.95</price> 7 </book> 8 </bookstore> 1、往<bookstore>节点中插入一个<book>节点: 1 XmlDocument xmlDoc=new XmlDocument(); 2 xmlDoc.Load("bookstore.xml"); 3 XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore> 4 XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点 5 xe1.SetAttribute("genre","李赞红");//设置该节点genre属性 6 xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性 7 XmlElement xesub1=xmlDoc.CreateElement("title"); 8 xesub1.InnerText="CS从入门到精通";//设置文本节点 9 xe1.AppendChild(xesub1);//添加到<book>节点中 10 XmlElement xesub2=xmlDoc.CreateElement("author"); 11 xesub2.InnerText="候捷"; 12 xe1.AppendChild(xesub2); 13 XmlElement xesub3=xmlDoc.CreateElement("price"); 14 xesub3.InnerText="58.3"; 15 xe1.AppendChild(xesub3); 16 root.AppendChild(xe1);//添加到<bookstore>节点中 17 xmlDoc.Save("bookstore.xml"); //================ 结果为: 1 <?xml version="1.0" encoding="gb2312"?> 2 <bookstore> 3 <book genre="fantasy" ISBN="2-3631-4"> 4 <title>Oberon‘s Legacy</title> 5 <author>Corets, Eva</author> 6 <price>5.95</price> 7 </book> 8 <book genre="李赞红" ISBN="2-3631-4"> 9 <title>CS从入门到精通</title> 10 <author>候捷</author> 11 <price>58.3</price> 12 </book> 13 </bookstore> 2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。 1 //获取bookstore节点的所有子节点 2 XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes; 3 foreach(XmlNode xn in nodeList)//遍历所有子节点 4 { 5 XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型 6 if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红” 7 { 8 xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红” 9 XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点 10 foreach(XmlNode xn1 in nls)//遍历 11 { 12 XmlElement xe2=(XmlElement)xn1;//转换类型 13 if(xe2.Name=="author")//如果找到 14 { 15 xe2.InnerText="亚胜";//则修改 16 break;//找到退出来就可以了 17 } 18 } 19 break; 20 } 21 } 22 xmlDoc.Save("bookstore.xml");//保存。 //================= 最后结果为: 1 <?xml version="1.0" encoding="gb2312"?> 2 <bookstore> 3 <book genre="fantasy" ISBN="2-3631-4"> 4 <title>Oberon‘s Legacy</title> 5 <author>Corets, Eva</author> 6 <price>5.95</price> 7 </book> 8 <book genre="update李赞红" ISBN="2-3631-4"> 9 <title>CS从入门到精通</title> 10 <author>亚胜</author> 11 <price>58.3</price> 12 </book> 13 </bookstore> 3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。 1 XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes; 2 foreach(XmlNode xn in xnl) 3 { 4 XmlElement xe=(XmlElement)xn; 5 if(xe.GetAttribute("genre")=="fantasy") 6 { 7 xe.RemoveAttribute("genre");//删除genre属性 8 } 9 else if(xe.GetAttribute("genre")=="update李赞红") 10 { 11 xe.RemoveAll();//删除该节点的全部内容 12 } 13 } 14 xmlDoc.Save("bookstore.xml"); //==================== 最后结果为: 1 <?xml version="1.0" encoding="gb2312"?> 2 <bookstore> 3 <book ISBN="2-3631-4"> 4 <title>Oberon‘s Legacy</title> 5 <author>Corets, Eva</author> 6 <price>5.95</price> 7 </book> 8 <book> 9 </book> 10 </bookstore> 4、显示所有数据。 1 XmlNode xn=xmlDoc.SelectSingleNode("bookstore"); 2 XmlNodeList xnl=xn.ChildNodes; 3 foreach(XmlNode xnf in xnl) 4 { 5 XmlElement xe=(XmlElement)xnf; 6 Console.WriteLine(xe.GetAttribute("genre"));//显示属性值 7 Console.WriteLine(xe.GetAttribute("ISBN")); 8 XmlNodeList xnf1=xe.ChildNodes; 9 foreach(XmlNode xn2 in xnf1) 10 { 11 Console.WriteLine(xn2.InnerText);//显示子节点点文本 12 } 13 } 转载:http://blog.csdn.net/s98/archive/2004/10/17/140307.aspxView Code
C#操作XML的类:xmlHelper例子
首先,看下这个XmlHelper类库的结构,如下图: 然后,在Vs中新建一个解决方案,叫做XMLHelper,添加一个C# 类库项目XMLHelper,重命名Class1.cs为XmlHelper.cs。 再为XmlHelper.cs添加 using System.Collections; using System.Xml; 这两个引用保证了我们可以使用XML的大部分功能和哈希表. 主要的代码如下: C#代码 1 namespace XMLHelper 2 { 3 public class XmlHelper 4 { 5 #region 公共变量 6 XmlDocument xmldoc; 7 XmlNode xmlnode; 8 XmlElement xmlelem; 9 #endregion 10 11 #region 创建Xml文档 12 /// <summary> 13 /// 创建一个带有根节点的Xml文件 14 /// </summary> 15 /// <param name="FileName">Xml文件名称</param> 16 /// <param name="rootName">根节点名称</param> 17 /// <param name="Encode">编码方式:gb2312,UTF-8等常见的</param> 18 /// <param name="DirPath">保存的目录路径</param> 19 /// <returns></returns> 20 public bool CreateXmlDocument(string FileName, string rootName, string Encode) 21 { 22 try 23 { 24 xmldoc = new XmlDocument(); 25 XmlDeclaration xmldecl; 26 xmldecl = xmldoc.CreateXmlDeclaration("1.0", Encode, null); 27 xmldoc.AppendChild(xmldecl); 28 xmlelem = xmldoc.CreateElement("", rootName, ""); 29 xmldoc.AppendChild(xmlelem); 30 xmldoc.Save(FileName); 31 return true; 32 } 33 catch (Exception e) 34 { 35 return false; 36 throw new Exception(e.Message); 37 } 38 } 39 40 #endregion 41 42 #region 常用操作方法(增删改) 43 /// <summary> 44 /// 插入一个节点和它的若干子节点 45 /// </summary> 46 /// <param name="XmlFile">Xml文件路径</param> 47 /// <param name="NewNodeName">插入的节点名称</param> 48 /// <param name="HasAttributes">此节点是否具有属性,True为有,False为无</param> 49 /// <param name="fatherNode">此插入节点的父节点</param> 50 /// <param name="htAtt">此节点的属性,Key为属性名,Value为属性值</param> 51 /// <param name="htSubNode">子节点的属性,Key为Name,Value为InnerText</param> 52 /// <returns>返回真为更新成功,否则失败</returns> 53 public bool InsertNode(string XmlFile, string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode) 54 { 55 try 56 { 57 xmldoc = new XmlDocument(); 58 xmldoc.Load(XmlFile); 59 XmlNode root = xmldoc.SelectSingleNode(fatherNode); 60 xmlelem = xmldoc.CreateElement(NewNodeName); 61 62 if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性 63 { 64 SetAttributes(xmlelem, htAtt); 65 66 SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText 67 68 } 69 else 70 { 71 SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点 72 } 73 74 root.AppendChild(xmlelem); 75 xmldoc.Save(XmlFile); 76 77 return true; 78 } 79 catch (Exception e) 80 { 81 82 throw new Exception(e.Message); 83 84 } 85 } 86 /// <summary> 87 /// 更新节点 88 /// </summary> 89 /// <param name="XmlFile">Xml文件路径</param> 90 /// <param name="fatherNode">需要更新节点的上级节点</param> 91 /// <param name="htAtt">需要更新的属性表,Key代表需要更新的属性,Value代表更新后的值</param> 92 /// <param name="htSubNode">需要更新的子节点的属性表,Key代表需要更新的子节点名字Name,Value代表更新后的值InnerText</param> 93 /// <returns>返回真为更新成功,否则失败</returns> 94 public bool UpdateNode(string XmlFile, string fatherNode, Hashtable htAtt, Hashtable htSubNode) 95 { 96 try 97 { 98 xmldoc = new XmlDocument(); 99 xmldoc.Load(XmlFile); 100 XmlNodeList root = xmldoc.SelectSingleNode(fatherNode).ChildNodes; 101 UpdateNodes(root, htAtt, htSubNode); 102 xmldoc.Save(XmlFile); 103 return true; 104 } 105 catch (Exception e) 106 { 107 throw new Exception(e.Message); 108 } 109 } 110 111 /// <summary> 112 /// 删除指定节点下的子节点 113 /// </summary> 114 /// <param name="XmlFile">Xml文件路径</param> 115 /// <param name="fatherNode">制定节点</param> 116 /// <returns>返回真为更新成功,否则失败</returns> 117 public bool DeleteNodes(string XmlFile, string fatherNode) 118 { 119 try 120 { 121 xmldoc = new XmlDocument(); 122 xmldoc.Load(XmlFile); 123 xmlnode = xmldoc.SelectSingleNode(fatherNode); 124 xmlnode.RemoveAll(); 125 xmldoc.Save(XmlFile); 126 return true; 127 } 128 catch (XmlException xe) 129 { 130 throw new XmlException(xe.Message); 131 } 132 } 133 #endregion 134 135 #region 私有方法 136 /// <summary> 137 /// 设置节点属性 138 /// </summary> 139 /// <param name="xe">节点所处的Element</param> 140 /// <param name="htAttribute">节点属性,Key代表属性名称,Value代表属性值</param> 141 private void SetAttributes(XmlElement xe, Hashtable htAttribute) 142 { 143 foreach (DictionaryEntry de in htAttribute) 144 { 145 xe.SetAttribute(de.Key.ToString(), de.Value.ToString()); 146 } 147 } 148 /// <summary> 149 /// 增加子节点到根节点下 150 /// </summary> 151 /// <param name="rootNode">上级节点名称</param> 152 /// <param name="XmlDoc">Xml文档</param> 153 /// <param name="rootXe">父根节点所属的Element</param> 154 /// <param name="SubNodes">子节点属性,Key为Name值,Value为InnerText值</param> 155 private void SetNodes(string rootNode, XmlDocument XmlDoc, XmlElement rootXe, Hashtable SubNodes) 156 { 157 foreach (DictionaryEntry de in SubNodes) 158 { 159 xmlnode = XmlDoc.SelectSingleNode(rootNode); 160 XmlElement subNode = XmlDoc.CreateElement(de.Key.ToString()); 161 subNode.InnerText = de.Value.ToString(); 162 rootXe.AppendChild(subNode); 163 } 164 } 165 /// <summary> 166 /// 更新节点属性和子节点InnerText值 167 /// </summary> 168 /// <param name="root">根节点名字</param> 169 /// <param name="htAtt">需要更改的属性名称和值</param> 170 /// <param name="htSubNode">需要更改InnerText的子节点名字和值</param> 171 private void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode) 172 { 173 foreach (XmlNode xn in root) 174 { 175 xmlelem = (XmlElement)xn; 176 if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性 177 { 178 foreach (DictionaryEntry de in htAtt)//遍历属性哈希表 179 { 180 if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性 181 { 182 xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value赋给此属性Key 183 } 184 } 185 } 186 if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText 187 { 188 XmlNodeList xnl = xmlelem.ChildNodes; 189 foreach (XmlNode xn1 in xnl) 190 { 191 XmlElement xe = (XmlElement)xn1; 192 foreach (DictionaryEntry de in htSubNode) 193 { 194 if (xe.Name == de.Key.ToString())//htSubNode中的key存储了需要更改的节点名称, 195 { 196 xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key节点更新后的数据 197 } 198 } 199 } 200 } 201 202 } 203 } 204 #endregion 205 } 206 } 207 208 209 文章来自学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代码 210 <a href="http://www.xueit.com/cshare/show-4275-2.aspx"><?xml version="1.0" encoding="utf-8"?> 211 <AppSettings/></a> 二、执行插入节点操作,如下图:(插入的节点数据在程序中,请稍候在本文尾部下载) 我们再打开这个文件,看看插入效果和程序中的一样么: Xml代码 212 <?xml version="1.0" encoding="utf-8"?> 213 <AppSettings> 214 <Fan Nickname="Jacky"> 215 <Age>23</Age> 216 </Fan> 217 </AppSettings> 三、我们修改一下节点内容: 修改效果如下: Xml代码 218 <?xml version="1.0" encoding="utf-8"?> 219 <AppSettings> 220 <Fan Nickname="Doggy"> 221 <Age>3</Age> 222 </Fan> 223 </AppSettings> 四、好了,删除刚才的那些节点吧: 又变回原样了: Xml代码 224 <?xml version="1.0" encoding="utf-8"?> 225 <AppSettings/> OK,这就是这个Helper的主要功能,你可以重载一些函数,增加它的功能,让它更加健壮,这回我就多了个帮手了,呵呵,可以根据自己需求更改,以后就不怕写Xml了,当然,你也可以把它移植到移动项目中,同样可行,只是到时候请注意路径问题,最好使用绝对路径! 文章来自学IT网:http://www.xueit.com/cshare/show-4275-2.aspxView Code
Linq To Xml学习 - 3.查询、更新、删除
文章最后有该示例的XML文档。 查找具有特定属性的元素 XElement root = XElement.Load("PurchaseOrder.xml"); IEnumerable address = from el in root.Elements("Address") where (string)el.Attribute("Type") == "Billing" select el; foreach (XElement el in address) Console.WriteLine(el); 输出为: <Address Type="Billing"> <Name>Tai YeeName> <Street>8 Oak AvenueStreet> <City>Old TownCity> <State>PAState> <Zip>95819Zip> <Country>USACountry> Address> 内存中 XML 树修改与函数构造 就地修改 XML 树是更改 XML 文档形状的传统方法。 典型的应用程序将文档加载到数据存储区(如 DOM 或 LINQ to XML);使用编程接口插入节点、删除节点或更改节点的内容;然后将 XML 保存到文件或通过网络传输。 LINQ to XML 允许使用另一种可在许多方案中使用的方法:函数构造。 函数构造将修改数据视为转换问题,而不是数据存储区的具体操作。 如果您采用某种数据表示形式并有效地将其从一种形式转换为另一种形式,其结果等效于您采用一个数据存储区并对其以某种方式进行操作以采用另一种形状。 函数构造方法的关键是将查询的结果传递给 XDocument 和 XElement 构造函数。 此示例假设您想修改下面的简单 XML 文档,使属性变为元素。 本节首先介绍传统的就地修改方法。 然后显示函数构造方法。XML文件: xml version="1.0" encoding="utf-8" ?> <Root Data1="123" Data2="456"> <Child1>ContentChild1> Root> 您可以编写一些过程代码以便从属性创建元素,然后删除属性,如下所示: XElement root = XElement.Load("Data.xml"); foreach (XAttribute att in root.Attributes()) { root.Add(new XElement(att.Name, (string)att)); } root.Attributes().Remove(); Console.WriteLine(root); 输出结果为: <Root> <Child1>ContentChild1> <Data1>123Data1> <Data2>456Data2> Root> 函数构造方法 相比之下,函数方法包含用于形成新树的代码、从源树中选择元素和属性并在将其添加到新树中时进行相应的转换。 函 数方法如下所示: XElement root = XElement.Load("Data.xml"); XElement newTree = new XElement("Root", root.Element("Child1"), from att in root.Attributes() select new XElement(att.Name, (string)att) ); Console.WriteLine(newTree); 在本例中,函数示例一点也不比第一个示例简短,而且一点也不比第一个示例简单。 但如果要对一个 XML 树进行很多 更改,则非函数方法将变得非常复杂,而且会显得很笨拙。 相比之下,使用函数方法时,您只需形成所需的 XML,嵌 入适当的查询和表达式以提取需要的内容。 函数方法生成的代码更易于维护。 请注意,在本例中,函数方法的执行效果可能没有树操作方法好。 主要问题是函数方法创建了更多短生存期的对象。 但是,如果使用函数方法能够提高程序员的效率,则折中也是一种有效的方式。 这是一个很简单的示例,但它显示了这两种方法之间基本原理上的差异。 对于转换较大的 XML 文档,函数方法可以产 生更高的效率增益。 向 XML 树中添加元素、属性和节点 下面的方法将子内容添加到 XElement 或 XDocument 中: 方法 说明 Add 在 XContainer 的子内容的末尾添加内容。 AddFirst 在 XContainer 的子内容的开头添加内容。 下面的方法将内容添加为 XNode 的同级节点。 向其中添加同级内容的最常见的节点是 XElement,不过你也可以将有 效的同级内容添加到其他类型的节点,例如 XText 或 XComment。 方法 说明 AddAfterSelf 在 XNode 后面添加内容。 AddBeforeSelf 在 XNode 前面添加内容。 示例: XElement srcTree = new XElement("Root", new XElement("Element1", 1), new XElement("Element2", 2), new XElement("Element3", 3), new XElement("Element4", 4), new XElement("Element5", 5) ); XElement xmlTree = new XElement("Root", new XElement("Child1", 1), new XElement("Child2", 2), new XElement("Child3", 3), new XElement("Child4", 4), new XElement("Child5", 5) ); xmlTree.Add(new XElement("NewChild", "new content")); xmlTree.Add( from el in srcTree.Elements() where (int)el > 3 select el ); // Even though Child9 does not exist in srcTree, the following statement will not // throw an exception, and nothing will be added to xmlTree. xmlTree.Add(srcTree.Element("Child9")); Console.WriteLine(xmlTree); 输出结果: <Root> <Child1>1Child1> <Child2>2Child2> <Child3>3Child3> <Child4>4Child4> <Child5>5Child5> <NewChild>new contentNewChild> <Element4>4Element4> <Element5>5Element5> Root> 修改 XML 树中的元素、属性和节点 下表汇总了修改元素、元素的子元素或元素属性 (Attribute) 时可以使用的方法和属性 (Property)。 下面的方法修改 XElement。 方法 说明 XElement..::.Parse 用已分析的 XML 替换元素。 XElement..::.RemoveAll 移除元素的所有内容(子节点和属性)。 XElement..::.RemoveAttributes 移除元素的属性。 XElement..::.ReplaceAll 替换元素的所有内容(子节点和属性)。 XElement..::.ReplaceAttributes 替换元素的属性。 XElement..::.SetAttributeValue 设置属性的值。 如果该属性不存在,则创建该属性。 如果值设置为 null,则移除该属性。 XElement..::.SetElementValue 设置子元素的值。 如果该元素不存在,则创建该元素。 如果值设置为 null,则移除该元素。 XElement..::.Value 用指定的文本替换元素的内容(子节点)。 XElement..::.SetValue 设置元素的值。 下面的方法修改 XAttribute。 方法 说明 XAttribute..::.Value 设置属性的值。 XAttribute..::.SetValue 设置属性的值。 下面的方法修改 XNode(包括 XElement 或 XDocument)。 方法 说明 XNode..::.ReplaceWith 用新内容替换节点。 下面的方法修改 XContainer(XElement 或 XDocument)。 方法 说明 XContainer..::.ReplaceNodes 用新内容替换子节点。 XElement.SetElementValue 方法 此方法旨在简化将名称/值对列表用作子元素集时的维护。维护列表时,需要添加对、修改对或删除对。 如果调用此方法将不存在的名称作为子元素传递,则此方法会为您创建一个子元素。如果您调用此方 法来传递一个现有子元素的名称,则此方法会将此子元素的值更改为指定的值。如果您为 value 传递 了 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则此方法会移除子元素。 // Create an element with no content XElement root = new XElement("Root"); // Add some name/value pairs. root.SetElementValue("Ele1", 1); root.SetElementValue("Ele2", 2); root.SetElementValue("Ele3", 3); Console.WriteLine(root); // Modify one of the name/value pairs. root.SetElementValue("Ele2", 22); Console.WriteLine(root); // Remove one of the name/value pairs. root.SetElementValue("Ele3", null); Console.WriteLine(root); 输出结果: <Root> <Ele1>1Ele1> <Ele2>2Ele2> <Ele3>3Ele3> Root> <Root> <Ele1>1Ele1> <Ele2>22Ele2> <Ele3>3Ele3> Root> <Root> <Ele1>1Ele1> <Ele2>22Ele2> Root> XElement.SetAttributeValue 方法 此方法旨在简化将名称/值对列表用作属性集时的维护。维护列表时,需要添加对、修改对或删除对。 如果调用此方法将不存在的名称作为属性传递,则此方法会为您创建一个属性。如果调用此方法来传递 现有属性的名称,则此方法将会属性的值修改为指定的值。如果您为 value 传递了 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则此方法会移除该属性。 此方法将引发 Changed 和 Changing 事件。 将值分配给具有指定名称的属性。如果不存在具有指定名称的属性,则添加新属性。如果值为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则删除具有指定名称的属 性(如果存在)。 // Create an element with no content. XElement root = new XElement("Root"); // Add some name/value pairs. root.SetAttributeValue("Att1", 1); root.SetAttributeValue("Att2", 2); root.SetAttributeValue("Att3", 3); Console.WriteLine(root); // Modify one of the name/value pairs. root.SetAttributeValue("Att2", 22); Console.WriteLine(root); // Remove one of the name/value pairs. root.SetAttributeValue("Att3", null); Console.WriteLine(root); 输出结果为: <Root Att1="1" Att2="2" Att3="3" /> <Root Att1="1" Att2="22" Att3="3" /> <Root Att1="1" Att2="22" /> XNode.ReplaceWith 方法 使用指定的内容替换此节点。 XElement xmlTree = new XElement("Root", new XElement("Child1", "child1 content"), new XElement("Child2", "child2 content"), new XElement("Child3", "child3 content"), new XElement("Child4", "child4 content"), new XElement("Child5", "child5 content") ); XElement child3 = xmlTree.Element("Child3"); child3.ReplaceWith( new XElement("NewChild", "new content") ); Console.WriteLine(xmlTree); 输出结果: <Root> <Child1>child1 contentChild1> <Child2>child2 contentChild2> <NewChild>new contentNewChild> <Child4>child4 contentChild4> <Child5>child5 contentChild5> Root> 从 XML 树中移除元素、属性和节点 可以修改 XML 树,移除元素、属性和其他类型的节点。 从 XML 文档中移除单个元素或单个属性的操作非常简单。 但是,若要移除多个元素或属性的集合,则 应首先将一个集合具体化为一个列表,然后从该列表中删除相应元素或属性。 最好的方法是使用 Remove 扩展方法,该方法可以实现此操作。 这么做的主要原因在于,从 XML 树检索的大多数集合都是用延迟执行生成的。 如果不首先将集合具体 化为列表,或者不使用扩展方法,则可能会遇到某类 Bug。 示例: 此示例演示三种移除元素的方法。 第一种,移除单个元素。 第二种,检索元素的集合,使用 Enumerable.ToList<(Of <(TSource>)>) 运算符将它们具体化,然后移除集合。 最后一种,检索 元素的集合,使用 Remove 扩展方法移除元素。 XElement root = XElement.Parse(@" "); root.Element("Child1").Element("GrandChild1").Remove(); root.Element("Child2").Elements().ToList().Remove(); root.Element("Child3").Elements().Remove(); Console.WriteLine(root); 输出结果为: <Root> <Child1> <GrandChild2 /> <GrandChild3 /> Child1> <Child2 /> <Child3 /> Root>View Code
c# xml操作类
引子http://www.cnblogs.com/QDuck/archive/2007/01/10/617240.aspx public class XmlControl { protected string strXmlFile; protected XmlDocument objXmlDoc = new XmlDocument(); public XmlControl(string XmlFile) { // // TODO: 在這裡加入建構函式的程式碼 // try { objXmlDoc.Load(XmlFile); } catch (System.Exception ex) { throw ex; } strXmlFile = XmlFile; } public DataView GetData(string XmlPathNode) { //查找數據。返回一個DataView DataSet ds = new DataSet(); StringReader read = new StringReader(objXmlDoc.SelectSingleNode(XmlPathNode).OuterXml); ds.ReadXml(read); return ds.Tables[0].DefaultView; } public void Replace(string XmlPathNode,string Content) { //更新節點內容。 objXmlDoc.SelectSingleNode(XmlPathNode).InnerText = Content; } public void Delete(string Node) { //刪除一個節點。 string mainNode = Node.Substring(0,Node.LastIndexOf("/")); objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(Node)); } public void InsertNode(string MainNode,string ChildNode,string Element,string Content) { //插入一節點和此節點的一子節點。 XmlNode objRootNode = objXmlDoc.SelectSingleNode(MainNode); XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode); objRootNode.AppendChild(objChildNode); XmlElement objElement = objXmlDoc.CreateElement(Element); objElement.InnerText = Content; objChildNode.AppendChild(objElement); } public void InsertElement(string MainNode,string Element,string Attrib,string AttribContent,string Content) { //插入一個節點,帶一屬性。 XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode); XmlElement objElement = objXmlDoc.CreateElement(Element); objElement.SetAttribute(Attrib,AttribContent); objElement.InnerText = Content; objNode.AppendChild(objElement); } public void InsertElement(string MainNode,string Element,string Content) { //插入一個節點,不帶屬性。 XmlNode objNode = objXmlDoc.SelectSingleNode(MainNode); XmlElement objElement = objXmlDoc.CreateElement(Element); objElement.InnerText = Content; objNode.AppendChild(objElement); } public void Save() { //保存文檔。 try { objXmlDoc.Save(strXmlFile); } catch (System.Exception ex) { throw ex; } objXmlDoc = null; } } ========================================================= 实例应用: string strXmlFile = Server.MapPath("TestXml.xml"); XmlControl xmlTool = new XmlControl(strXmlFile); // 數據顯視 // dgList.DataSource = xmlTool.GetData("Book/Authors[ISBN=\"0002\"]"); // dgList.DataBind(); // 更新元素內容 // xmlTool.Replace("Book/Authors[ISBN=\"0002\"]/Content","ppppppp"); // xmlTool.Save(); // 添加一個新節點 // xmlTool.InsertNode("Book","Author","ISBN","0004"); // xmlTool.InsertElement("Book/Author[ISBN=\"0004\"]","Content","aaaaaaaaa"); // xmlTool.InsertElement("Book/Author[ISBN=\"0004\"]","Title","Sex","man","iiiiiiii"); // xmlTool.Save(); // 刪除一個指定節點的所有內容和屬性 // xmlTool.Delete("Book/Author[ISBN=\"0004\"]"); // xmlTool.Save(); // 刪除一個指定節點的子節點 // xmlTool.Delete("Book/Authors[ISBN=\"0003\"]"); // xmlTool.Save(); 1 <% 2 Class XMLDOMDocument 3 Private fNode,fANode 4 Private fErrInfo,fFileName,fOpen 5 Dim XmlDom 6 7 ‘返回节点的缩进字串 8 Private Property Get TabStr(byVal Node) 9 TabStr="" 10 If Node Is Nothing Then Exit Property 11 If not Node.parentNode Is nothing Then TabStr=" "&TabStr(Node.parentNode) 12 End Property 13 14 ‘返回一个子节点对象,ElementOBJ为父节点,ChildNodeObj要查找的节点,IsAttributeNode指出是否为属性对象 15 Public Property Get ChildNode(byVal ElementOBJ,byVal ChildNodeObj,byVal IsAttributeNode) 16 Dim Element 17 Set ChildNode=Nothing 18 19 If IsNull(ChildNodeObj) Then 20 If IsAttributeNode=false Then 21 Set ChildNode=fNode 22 Else 23 Set ChildNode=fANode 24 End If 25 Exit Property 26 ElseIf IsObject(ChildNodeObj) Then 27 Set ChildNode=ChildNodeObj 28 Exit Property 29 End If 30 31 Set Element=Nothing 32 If LCase(TypeName(ChildNodeObj))="string" and Trim(ChildNodeObj)<>"" Then 33 If IsNull(ElementOBJ) Then 34 Set Element=fNode 35 ElseIf LCase(TypeName(ElementOBJ))="string" Then 36 If Trim(ElementOBJ)<>"" Then 37 Set Element=XmlDom.selectSingleNode("//"&Trim(ElementOBJ)) 38 If Lcase(Element.nodeTypeString)="attribute" Then Set Element=Element.selectSingleNode("..") 39 End If 40 ElseIf IsObject(ElementOBJ) Then 41 Set Element=ElementOBJ 42 End If 43 44 If Element Is Nothing Then 45 Set ChildNode=XmlDom.selectSingleNode("//"&Trim(ChildNodeObj)) 46 ElseIf IsAttributeNode=true Then 47 Set ChildNode=Element.selectSingleNode("./@"&Trim(ChildNodeObj)) 48 Else 49 Set ChildNode=Element.selectSingleNode("./"&Trim(ChildNodeObj)) 50 End If 51 End If 52 End Property 53 54 ‘读取最后的错误信息 55 Public Property Get ErrInfo 56 ErrInfo=fErrInfo 57 End Property 58 59 ‘给xml内容 60 Public Property Get xmlText(byVal ElementOBJ) 61 xmlText="" 62 If fopen=false Then Exit Property 63 64 Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false) 65 If ElementOBJ Is Nothing Then Set ElementOBJ=XmlDom 66 67 xmlText=ElementOBJ.xml 68 End Property 69 70 ‘================================================================= 71 ‘类初始化 72 Private Sub Class_Initialize() 73 Set XmlDom=CreateObject("Microsoft.XMLDOM") 74 XmlDom.preserveWhiteSpace=true 75 76 Set fNode=Nothing 77 Set fANode=Nothing 78 79 fErrInfo="" 80 fFileName="" 81 fopen=false 82 End Sub 83 84 ‘类释放 85 Private Sub Class_Terminate() 86 Set fNode=Nothing 87 Set fANode=Nothing 88 Set XmlDom=nothing 89 fopen=false 90 End Sub 91 92 ‘===================================================================== 93 ‘建立一个XML文件,RootElementName:根结点名。XSLURL:使用XSL样式地址 94 ‘返回根结点 95 Function Create(byVal RootElementName,byVal XslUrl) 96 Dim PINode,RootElement 97 98 Set Create=Nothing 99 100 If (XmlDom Is Nothing) Or (fopen=true) Then Exit Function 101 102 If Trim(RootElementName)="" Then RootElementName="Root" 103 104 Set PINode=XmlDom.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""GB2312""") 105 XmlDom.appendChild PINode 106 107 Set PINode=XMLDOM.CreateProcessingInstruction("xml-stylesheet", "type=""text/xsl"" href="""&XslUrl&"""") 108 XmlDom.appendChild PINode 109 110 Set RootElement=XmlDom.createElement(Trim(RootElementName)) 111 XmlDom.appendChild RootElement 112 113 Set Create=RootElement 114 115 fopen=True 116 set fNode=RootElement 117 End Function 118 119 ‘开打一个已经存在的XML文件,返回打开状态 120 Function Open(byVal xmlSourceFile) 121 Open=false 122 123 xmlSourceFile=Trim(xmlSourceFile) 124 If xmlSourceFile="" Then Exit Function 125 126 XmlDom.async = false 127 XmlDom.load xmlSourceFile 128 129 fFileName=xmlSourceFile 130 131 If not IsError Then 132 Open=true 133 fopen=true 134 End If 135 End Function 136 137 ‘关闭 138 Sub Close() 139 Set fNode=Nothing 140 Set fANode=Nothing 141 142 fErrInfo="" 143 fFileName="" 144 fopen=false 145 End Sub 146 147 ‘读取一个NodeOBJ的节点Text的值 148 ‘NodeOBJ可以是节点对象或节点名,为null就取当前默认fNode 149 Function getNodeText(byVal NodeOBJ) 150 getNodeText="" 151 If fopen=false Then Exit Function 152 153 Set NodeOBJ=ChildNode(null,NodeOBJ,false) 154 If NodeOBJ Is Nothing Then Exit Function 155 156 If Lcase(NodeOBJ.nodeTypeString)="element" Then 157 set fNode=NodeOBJ 158 Else 159 set fANode=NodeOBJ 160 End If 161 getNodeText=NodeOBJ.text 162 End function 163 164 ‘插入在BefelementOBJ下面一个名为ElementName,Value为ElementText的子节点。 165 ‘IsFirst:是否插在第一个位置;IsCDATA:说明节点的值是否属于CDATA类型 166 ‘插入成功就返回新插入这个节点 167 ‘BefelementOBJ可以是对象也可以是节点名,为null就取当前默认对象 168 Function InsertElement(byVal BefelementOBJ,byVal ElementName,byVal ElementText,byVal IsFirst,byVal IsCDATA) 169 Dim Element,TextSection,SpaceStr 170 Set InsertElement=Nothing 171 172 If not fopen Then Exit Function 173 174 Set BefelementOBJ=ChildNode(XmlDom,BefelementOBJ,false) 175 If BefelementOBJ Is Nothing Then Exit Function 176 177 Set Element=XmlDom.CreateElement(Trim(ElementName)) 178 179 ‘SpaceStr=vbCrLf&TabStr(BefelementOBJ) 180 ‘Set STabStr=XmlDom.CreateTextNode(SpaceStr) 181 182 ‘If Len(SpaceStr)>2 Then SpaceStr=Left(SpaceStr,Len(SpaceStr)-2) 183 ‘Set ETabStr=XmlDom.CreateTextNode(SpaceStr) 184 185 If IsFirst=true Then 186 ‘BefelementOBJ.InsertBefore ETabStr,BefelementOBJ.firstchild 187 BefelementOBJ.InsertBefore Element,BefelementOBJ.firstchild 188 ‘BefelementOBJ.InsertBefore STabStr,BefelementOBJ.firstchild 189 Else 190 ‘BefelementOBJ.appendChild STabStr 191 BefelementOBJ.appendChild Element 192 ‘BefelementOBJ.appendChild ETabStr 193 End If 194 195 If IsCDATA=true Then 196 set TextSection=XmlDom.createCDATASection(ElementText) 197 Element.appendChild TextSection 198 ElseIf ElementText<>"" Then 199 Element.Text=ElementText 200 End If 201 202 Set InsertElement=Element 203 Set fNode=Element 204 End Function 205 206 ‘在ElementOBJ节点上插入或修改名为AttributeName,值为:AttributeText的属性 207 ‘如果已经存在名为AttributeName的属性对象,就进行修改。 208 ‘返回插入或修改属性的Node 209 ‘ElementOBJ可以是Element对象或名,为null就取当前默认对象 210 Function setAttributeNode(byVal ElementOBJ,byVal AttributeName,byVal AttributeText) 211 Dim AttributeNode 212 Set setAttributeNode=nothing 213 214 If not fopen Then Exit Function 215 216 Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false) 217 If ElementOBJ Is Nothing Then Exit Function 218 219 Set AttributeNode=ElementOBJ.attributes.getNamedItem(AttributeName) 220 If AttributeNode Is nothing Then 221 Set AttributeNode=XmlDom.CreateAttribute(AttributeName) 222 ElementOBJ.setAttributeNode AttributeNode 223 End If 224 AttributeNode.text=AttributeText 225 226 set fNode=ElementOBJ 227 set fANode=AttributeNode 228 Set setAttributeNode=AttributeNode 229 End Function 230 231 ‘修改ElementOBJ节点的Text值,并返回这个节点 232 ‘ElementOBJ可以对象或对象名,为null就取当前默认对象 233 Function UpdateNodeText(byVal ElementOBJ,byVal NewElementText,byVal IsCDATA) 234 Dim TextSection 235 236 set UpdateNodeText=nothing 237 If not fopen Then Exit Function 238 239 Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false) 240 If ElementOBJ Is Nothing Then Exit Function 241 242 If IsCDATA=true Then 243 set TextSection=XmlDom.createCDATASection(NewElementText) 244 If ElementOBJ.firstchild Is Nothing Then 245 ElementOBJ.appendChild TextSection 246 ElseIf LCase(ElementOBJ.firstchild.nodeTypeString)="cdatasection" Then 247 ElementOBJ.replaceChild TextSection,ElementOBJ.firstchild 248 End If 249 Else 250 ElementOBJ.Text=NewElementText 251 End If 252 253 set fNode=ElementOBJ 254 Set UpdateNodeText=ElementOBJ 255 End Function 256 257 ‘返回符合testValue条件的第一个ElementNode,为null就取当前默认对象 258 Function getElementNode(byVal ElementName,byVal testValue) 259 Dim Element,regEx,baseName 260 261 Set getElementNode=nothing 262 If not fopen Then Exit Function 263 264 testValue=Trim(testValue) 265 Set regEx=New RegExp 266 regEx.Pattern="^[A-Za-z]+" 267 regEx.IgnoreCase=true 268 If regEx.Test(testValue) Then testValue="/"&testValue 269 Set regEx=nothing 270 271 baseName=LCase(Right(ElementName,Len(ElementName)-InStrRev(ElementName,"/",-1))) 272 273 Set Element=XmlDom.SelectSingleNode("//"&ElementName&testValue) 274 275 If Element Is Nothing Then 276 ‘Response.write ElementName&testValue 277 Set getElementNode=nothing 278 Exit Function 279 End If 280 281 Do While LCase(Element.baseName)<>baseName 282 Set Element=Element.selectSingleNode("..") 283 If Element Is Nothing Then Exit Do 284 Loop 285 286 If LCase(Element.baseName)<>baseName Then 287 Set getElementNode=nothing 288 Else 289 Set getElementNode=Element 290 If Lcase(Element.nodeTypeString)="element" Then 291 Set fNode=Element 292 Else 293 Set fANode=Element 294 End If 295 End If 296 End Function 297 298 ‘删除一个子节点 299 Function removeChild(byVal ElementOBJ) 300 removeChild=false 301 If not fopen Then Exit Function 302 303 Set ElementOBJ=ChildNode(null,ElementOBJ,false) 304 If ElementOBJ Is Nothing Then Exit Function 305 306 ‘response.write ElementOBJ.baseName 307 308 If Lcase(ElementOBJ.nodeTypeString)="element" Then 309 If ElementOBJ Is fNode Then set fNode=Nothing 310 If ElementOBJ.parentNode Is Nothing Then 311 XmlDom.removeChild(ElementOBJ) 312 Else 313 ElementOBJ.parentNode.removeChild(ElementOBJ) 314 End If 315 removeChild=True 316 End If 317 End Function 318 319 ‘清空一个节点所有子节点 320 Function ClearNode(byVal ElementOBJ) 321 set ClearNode=Nothing 322 If not fopen Then Exit Function 323 324 Set ElementOBJ=ChildNode(null,ElementOBJ,false) 325 If ElementOBJ Is Nothing Then Exit Function 326 327 ElementOBJ.text="" 328 ElementOBJ.removeChild(ElementOBJ.firstchild) 329 330 Set ClearNode=ElementOBJ 331 Set fNode=ElementOBJ 332 End Function 333 334 ‘删除子节点的一个属性 335 Function removeAttributeNode(byVal ElementOBJ,byVal AttributeOBJ) 336 removeAttributeNode=false 337 If not fopen Then Exit Function 338 339 Set ElementOBJ=ChildNode(XmlDom,ElementOBJ,false) 340 If ElementOBJ Is Nothing Then Exit Function 341 342 Set AttributeOBJ=ChildNode(ElementOBJ,AttributeOBJ,true) 343 If not AttributeOBJ Is nothing Then 344View Code
c#读写xml文件
c#读写xml文件 已知有一个XML文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> </bookstore> 1、往<bookstore>节点中插入一个<book>节点: XmlDocument xmlDoc=new XmlDocument(); xmlDoc.Load("bookstore.xml"); XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore> XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点 xe1.SetAttribute("genre","李赞红");//设置该节点genre属性 xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性 XmlElement xesub1=xmlDoc.CreateElement("title"); xesub1.InnerText="CS从入门到精通";//设置文本节点 xe1.AppendChild(xesub1);//添加到<book>节点中 XmlElement xesub2=xmlDoc.CreateElement("author"); xesub2.InnerText="候捷"; xe1.AppendChild(xesub2); XmlElement xesub3=xmlDoc.CreateElement("price"); xesub3.InnerText="58.3"; xe1.AppendChild(xesub3); root.AppendChild(xe1);//添加到<bookstore>节点中 xmlDoc.Save("bookstore.xml"); //=============================================== 结果为: <?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book genre="李赞红" ISBN="2-3631-4"> <title>CS从入门到精通</title> <author>候捷</author> <price>58.3</price> </book> </bookstore> 2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。 XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点 foreach(XmlNode xn in nodeList)//遍历所有子节点 { XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型 if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红” { xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红” XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点 foreach(XmlNode xn1 in nls)//遍历 { XmlElement xe2=(XmlElement)xn1;//转换类型 if(xe2.Name=="author")//如果找到 { xe2.InnerText="亚胜";//则修改 break;//找到退出来就可以了 } } break; } } xmlDoc.Save("bookstore.xml");//保存。 //================================================== 最后结果为: <?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book genre="update李赞红" ISBN="2-3631-4"> <title>CS从入门到精通</title> <author>亚胜</author> <price>58.3</price> </book> </bookstore> 3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。 XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes; foreach(XmlNode xn in xnl) { XmlElement xe=(XmlElement)xn; if(xe.GetAttribute("genre")=="fantasy") { xe.RemoveAttribute("genre");//删除genre属性 } else if(xe.GetAttribute("genre")=="update李赞红") { xe.RemoveAll();//删除该节点的全部内容 } } xmlDoc.Save("bookstore.xml"); //=========================================== 最后结果为: <?xml version="1.0" encoding="gb2312"?> <bookstore> <book ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book> </book> </bookstore> 4、显示所有数据。 XmlNode xn=xmlDoc.SelectSingleNode("bookstore"); XmlNodeList xnl=xn.ChildNodes; foreach(XmlNode xnf in xnl) { XmlElement xe=(XmlElement)xnf; Console.WriteLine(xe.GetAttribute("genre"));//显示属性值 Console.WriteLine(xe.GetAttribute("ISBN")); XmlNodeList xnf1=xe.ChildNodes; foreach(XmlNode xn2 in xnf1) { Console.WriteLine(xn2.InnerText);//显示子节点点文本 } }View Code
C#:XML操作类
写的一个XML操作类,包括读取/插入/修改/删除。 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; namespace PuTianCheng { /// <summary> /// XmlHelper 的摘要说明 /// </summary> public class XmlHelper { public XmlHelper() { } /// <summary> /// 读取数据 /// </summary> /// <param name="path">路径</param> /// <param name="node">节点</param> /// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param> /// <returns>string</returns> /************************************************** * 使用示列: * XmlHelper.Read(path, "/Node", "") * XmlHelper.Read(path, "/Node/Element[@Attribute=‘Name‘]", "Attribute") ************************************************/ public static string Read(string path, string node, string attribute) { string value = ""; try { XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNode xn = doc.SelectSingleNode(node); value = (attribute.Equals("") ? xn.InnerText : xn.Attributes[attribute].Value); } catch { } return value; } /// <summary> /// 插入数据 /// </summary> /// <param name="path">路径</param> /// <param name="node">节点</param> /// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param> /// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param> /// <param name="value">值</param> /// <returns></returns> /************************************************** * 使用示列: * XmlHelper.Insert(path, "/Node", "Element", "", "Value") * XmlHelper.Insert(path, "/Node", "Element", "Attribute", "Value") * XmlHelper.Insert(path, "/Node", "", "Attribute", "Value") ************************************************/ public static void Insert(string path, string node, string element, string attribute, string value) { try { XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNode xn = doc.SelectSingleNode(node); if (element.Equals("")) { if (!attribute.Equals("")) { XmlElement xe = (XmlElement)xn; xe.SetAttribute(attribute, value); } } else { XmlElement xe = doc.CreateElement(element); if (attribute.Equals("")) xe.InnerText = value; else xe.SetAttribute(attribute, value); xn.AppendChild(xe); } doc.Save(path); } catch { } } /// <summary> /// 修改数据 /// </summary> /// <param name="path">路径</param> /// <param name="node">节点</param> /// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param> /// <param name="value">值</param> /// <returns></returns> /************************************************** * 使用示列: * XmlHelper.Insert(path, "/Node", "", "Value") * XmlHelper.Insert(path, "/Node", "Attribute", "Value") ************************************************/ public static void Update(string path, string node, string attribute, string value) { try { XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNode xn = doc.SelectSingleNode(node); XmlElement xe = (XmlElement)xn; if (attribute.Equals("")) xe.InnerText = value; else xe.SetAttribute(attribute, value); doc.Save(path); } catch { } } /// <summary> /// 删除数据 /// </summary> /// <param name="path">路径</param> /// <param name="node">节点</param> /// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param> /// <param name="value">值</param> /// <returns></returns> /************************************************** * 使用示列: * XmlHelper.Delete(path, "/Node", "") * XmlHelper.Delete(path, "/Node", "Attribute") ************************************************/ public static void Delete(string path, string node, string attribute) { try { XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNode xn = doc.SelectSingleNode(node); XmlElement xe = (XmlElement)xn; if (attribute.Equals("")) xn.ParentNode.RemoveChild(xn); else xe.RemoveAttribute(attribute); doc.Save(path); } catch { } } } } ================================================== XmlFile.xml: <?xml version="1.0" encoding="utf-8"?> <Root /> ================================================== 使用方法: string xml = Server.MapPath("XmlFile.xml"); //插入元素 //XmlHelper.Insert(xml, "/Root", "Studio", "", ""); //插入元素/属性 //XmlHelper.Insert(xml, "/Root/Studio", "Site", "Name", "小路工作室"); //XmlHelper.Insert(xml, "/Root/Studio", "Site", "Name", "丁香鱼工作室"); //XmlHelper.Insert(xml, "/Root/Studio", "Site", "Name", "谱天城工作室"); //XmlHelper.Insert(xml, "/Root/Studio/Site[@Name=‘谱天城工作室‘]", "Master", "", "红尘静思"); //插入属性 //XmlHelper.Insert(xml, "/Root/Studio/Site[@Name=‘小路工作室‘]", "", "Url", "http://www.wzlu.com/"); //XmlHelper.Insert(xml, "/Root/Studio/Site[@Name=‘丁香鱼工作室‘]", "", "Url", "http://www.luckfish.net/"); //XmlHelper.Insert(xml, "/Root/Studio/Site[@Name=‘谱天城工作室‘]", "", "Url", "http://www.putiancheng.com/"); //修改元素值 //XmlHelper.Update(xml, "/Root/Studio/Site[@Name=‘谱天城工作室‘]/Master", "", "RedDust"); //修改属性值 //XmlHelper.Update(xml, "/Root/Studio/Site[@Name=‘谱天城工作室‘]", "Url", "http://www.putiancheng.net/"); //XmlHelper.Update(xml, "/Root/Studio/Site[@Name=‘谱天城工作室‘]", "Name", "PuTianCheng Studio"); //读取元素值 //Response.Write("<div>" + XmlHelper.Read(xml, "/Root/Studio/Site/Master", "") + "</div>"); //读取属性值 //Response.Write("<div>" + XmlHelper.Read(xml, "/Root/Studio/Site", "Url") + "</div>"); //读取特定属性值 //Response.Write("<div>" + XmlHelper.Read(xml, "/Root/Studio/Site[@Name=‘丁香鱼工作室‘]", "Url") + "</div>"); //删除属性 //XmlHelper.Delete(xml, "/Root/Studio/Site[@Name=‘小路工作室‘]", "Url"); //删除元素 //XmlHelper.Delete(xml, "/Root/Studio", "");View Code