<>
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();
}
}
}