在.NET中使用DataSet来获取XML数据与保存XML数据很简单,很好用,不过有一些复杂点的XML结构,使用DataSet来操作就没有XmlDocument来操作这么好用了,所以本文在C#使用XmlDocument来操作XML的查询、增加、修改、删除、保存的基本操作。
下面看实例:
XML文件:books.xml 1<?xml version="1.0" encoding="UTF-8"?> 2<books> 3 <book> //这里没有id 下面代码会增加 4 <name>哈里波特</name> 5 <price>10</price> 6 <memo>这是一本很好看的书。</memo> 7 </book> 8 <book id="B02"> 9 <name>三国演义</name>10 <price>10</price>11 <memo>四大名著之一。</memo>12 </book>13 <book id="B03">14 <name>水浒</name>15 <price>6</price>16 <memo>四大名著之一。</memo>17 </book>18 <book id="B04">19 <name>红楼</name>20 <price>5</price>21 <memo>四大名著之一。</memo>22 </book>23</books>
下面是C#代码:1eusing System; 2using System.Collections.Generic; 3using System.Text; 4using System.Xml; 5 6namespace TestXml 7 { 8 class Program 9 {10 static void Main(string[] args)11 {
// XML表示Dom结构中的元素.XmlElement类的constructor 是protected,所以要通过XmlDocument().createElement()来实例化.12 XmlElement theBook = null, theElem = null, root = null;13 XmlDocument xmldoc = new XmlDocument();14 try15 {16 xmldoc.Load("Books.xml");17 root = xmldoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.1819 //--- 新建一本书开始 ----20 theBook = xmldoc.CreateElement("book");21 theElem = xmldoc.CreateElement("name");22 theElem.InnerText = "新书";23 theBook.AppendChild(theElem); //添加指定的节点的子节点列表的末尾.2425 theElem = xmldoc.CreateElement("price");
26 theElem.InnerText = "20"; // innerText: 所有子节点值的串联字符串.27 theBook.AppendChild(theElem);2829 theElem = xmldoc.CreateElement("memo");30 theElem.InnerText = "新书更好看。";31 theBook.AppendChild(theElem);32 root.AppendChild(theBook);33 Console.Out.WriteLine("--- 新建一本书开始 ----");34 Console.Out.WriteLine(root.OuterXml); //节点自身及其所以子节点的xml字符串.35 //--- 新建一本书完成 ----3637 //--- 下面对《哈里波特》做一些修改。 ----38 //--- 查询找《哈里波特》----39 theBook = (XmlElement)root.SelectSingleNode("/books/book[name=''哈里波特'']"); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.40 Console.Out.WriteLine("--- 查找《哈里波特》 ----");41 Console.Out.WriteLine(theBook.OuterXml);42 //--- 此时修改这本书的价格 -----43 theBook.GetElementsByTagName("price").Item(0).InnerText = "15";//getElementsByTagName返回的是NodeList,所以要跟上item(0)44 Console.Out.WriteLine("--- 此时修改这本书的价格 ----");45 Console.Out.WriteLine(theBook.OuterXml);46 //--- 另外还想加一个属性id,值为B01 ----47 theBook.SetAttribute("id", "B01");48 Console.Out.WriteLine("--- 另外还想加一个属性id,值为B01 ----");49 Console.Out.WriteLine(theBook.OuterXml);50 //--- 对《哈里波特》修改完成。 ----5152 //--- 要用id属性删除----53 theBook = (XmlElement)root.SelectSingleNode("/books/book[@id=''B02'']");54 Console.Out.WriteLine("--- 要用id属性删除《三国演义》这本书 ----");55 Console.Out.WriteLine(theBook.OuterXml);56 theBook.ParentNode.RemoveChild(theBook);57 Console.Out.WriteLine("--- 删除后的XML ----");58 Console.Out.WriteLine(xmldoc.OuterXml);5960 //--- 再将所有价格低于10的书删除 ----61 XmlNodeList someBooks = root.SelectNodes("/books/book[price<10]");62 Console.Out.WriteLine("--- 再将所有价格低于10的书删除 ---");63 Console.Out.WriteLine("--- 符合条件的书有 " someBooks.Count "本。 ---");6465 for (int i = 0; i < someBooks.Count; i ++ )66 {67 someBooks.Item(i).ParentNode.RemoveChild(someBooks.Item(i));68 }69 Console.Out.WriteLine("--- 删除后的XML ----");70 Console.Out.WriteLine(xmldoc.OuterXml);7172 xmldoc.Save("books.xml");//保存到books.xml7374 Console.In.Read();75 }76 catch (Exception e)77 {78 Console.Out.WriteLine(e.Message);79 }80 }81 }82}上面C#代码都有注释,很简单就看明白了。