<>
1>从根节点开始(查找)追加
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace 追加XML { class Program { static void Main(string[] args) { //追加XML文档(追加XML文档,有两种情况,第一:这个XML文档可能存在; 第二:这个XML文档可能不存在) XmlDocument doc = new XmlDocument(); XmlElement books; if (File.Exists("Books.xml")) { //1,如果XML文档存在 //既然XML文档已经存在,那么就加载这个XML文档 doc.Load("Books.xml"); //获取XML文档的根节点 (从根节点开始追加) books = doc.DocumentElement; } else { //2,如果XML文档不存在 //既然XML文档不存在,我们首先给这个XML文档添加一个文档描述:<?xml version="1.0" encoding="utf-8"?> XmlDeclaration dec = doc.CreateXmlDeclaration("1.0","utf-8",null); doc.AppendChild(dec); //创建这个XML文档的根节点 books = doc.CreateElement("Books"); doc.AppendChild(books); } //上面的步骤做好后,现在就开始给文档追加子节点了; XmlElement book = doc.CreateElement("Book"); books.AppendChild(book); XmlElement name = doc.CreateElement("Name"); name.InnerText = "C#编程宝典"; book.AppendChild(name); XmlElement price = doc.CreateElement("Price"); price.InnerText = "108¥"; book.AppendChild(price); XmlElement des = doc.CreateElement("Des"); des.InnerText = "太难了,看不懂"; book.AppendChild(des); doc.Save("Books.xml"); Console.WriteLine("保存成功"); Console.ReadKey(); } } }
2>从指定节点开始(查找)追加
首先我在D盘下有一个叫Order.xml的文件,这里演示在这个xml文件中查找根节点和Items节点下的内容
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace 给XML文档的指定节点追加内容 { class Program { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); if (File.Exists("D:/Order.xml")) { doc.Load("D:/Order.xml"); //-------------获取指定节点下的所有子节点的值 //获取Order这个节点 XmlNode orderNode = doc.SelectSingleNode("//Order"); //获取Order这个节点下的所有子节点 XmlNodeList orderSubNodes = orderNode.ChildNodes; foreach (XmlNode orderSubNode in orderSubNodes) { Console.WriteLine(orderSubNode.InnerText); //注意这里是输出Order所有子节点的文本内容,因为Items这个子节点本身没有文本内容(不过它有自己的子节点),所以这里仅仅输出了:张学友 dd00001 ;如果要输出Items的内容可以使用:Console.WriteLine(orderSubNode.InnerXml); 这样就输出了:张学友 dd00001 <OrderItem Name="手机" Count="1" /><OrderItem Name="电脑" Count="2" /> } //-------------获取指定节点下的所有子节点的属性值,注意是“属性值” //获取Items这个节点 (SelectSingleNode是获取符合括号中的Xpath表达式的第一个节点,这里是取唯一的意思) XmlNode itemsNode = doc.SelectSingleNode("/Order/Items"); //这段也可以这么写XmlNode itemsNode = doc.SelectSingleNode("/Order/Items");表示选择<Order>标签下的<Items>标签 //获取Items这个节点下的所有子节点 XmlNodeList itemsSubNodes = itemsNode.ChildNodes; foreach (XmlNode itemsSubNode in itemsSubNodes) { Console.WriteLine(itemsSubNode.Attributes["Name"].Value + itemsSubNode.Attributes["Count"].Value); } //-------------获取指定节点下的所有子节点的属性值,代码优化一下也可以 //因为Items下面有多个相同的<OrderItem>标签,不同的仅仅是<OrderItem>标签的属性值不同而已,那么我们就直接获取所有的<OrderItem>标签,进行遍历,然后取他们的属性就就可以了 //获取所有的OrderItem标签 XmlNodeList orderItems = doc.SelectNodes("//OrderItem"); //遍历 foreach (XmlNode orderItem in orderItems) { Console.WriteLine(orderItem.Attributes["Name"].Value + orderItem.Attributes["Count"].Value); } } else { Console.WriteLine("找不到这个文件"); } Console.ReadKey(); } } }
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
结果 | |
---|---|
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
3>XML文档节点的删除
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Xml文档节点的删除 { class Program { static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("D:/Order.xml"); //-----------删除指定节点下的所有子节点 //获取<Order>节点下的子节点<Items> XmlNode node = doc.SelectSingleNode("/Order/Items"); //删除<Items>这个节点下的所有子节点 //node.RemoveAll(); //-----------移除Name属性值为“手机”的那个子节点 //获取<Items>节点下的所有子节点 XmlNodeList nodes = node.ChildNodes; //遍历 foreach (XmlNode itemSubNode in nodes) { if (itemSubNode.Attributes["Name"].Value == "手机") { //移除node节点下指定的子节点 node.RemoveChild(itemSubNode); } } doc.Save("D:/Order.xml"); Console.WriteLine("删除成功"); Console.ReadKey(); } } }