使用XmlDocument是一种基于文档结构模型的方式来读取XML文件。在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树。最开始的一个结点叫作根结点,每个结点都可以有自己的子结点。得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性。
xn 代表一个结点
xn.Name;//这个结点的名称
xn.Value;//这个结点的值
xn.ChildNodes;//这个结点的所有子结点
xn.ParentNode;//这个结点的父结点
1. 使用XmlDocument操作XML文档
<?xml version="1.0" encoding="utf-8"?>
<!--XMLDoucment操作的示例xml文档-->
<bookstore>
<book Type="必修课" ISBN="7-111-19149-2">
<title>数据结构</title>
<author>严蔚敏</author>
<price>30.00</price>
</book>
<book Type="必修课" ISBN="7-111-19149-3">
<title>路由型与交换型互联网基础</title>
<author>程庆梅</author>
<price>27.00</price>
</book>
</bookstore>
1.1 读取文档/节点
读取xml文档:加载xml文档或xml字符串
Load:加载文件路径中的xml
LoadXml:加载xml字符串
XmlDocument doc = new XmlDocument();
//1.加载xml文档或xml字符串
//Load:加载文件路径中的xml
doc.Load(@"C:\Users\Ruoqi\source\repos\XmlLearn\example.xml");
//LoadXml:加载xml字符串
//doc.LoadXml(xmlstring);
读取xml文档中节点
//2.读取节点
//SelectSingleNode("bookstore")中的bookstore是xpath
//调用SelectSingleNode得到指定的结点
XmlNode xn = doc.SelectSingleNode("bookstore");
//得到根节点的所有子节点
XmlNodeList xnl = xn.ChildNodes;
//循环读取所有子节点下每一个节点的值
//xnitem第一次循环为第一个book节点,第二次循环为第二个book节点
foreach (var xnitem in xnl)
{
//将节点转换为元素,便于得到节点的属性值
XmlElement xle = (XmlElement)xnitem;
//通过GetAttribute得到具体的属性值
//第一个book节点的属性值Type和ISBN:<book Type="必修课" ISBN="7-111-19149-2">
//firstType = 必修课; firstISBN = 7-111-19149-2
var firstType = xle.GetAttribute("Type").ToString();
var firstISBN = xle.GetAttribute("ISBN").ToString();
//得到xnitem(第一个book节点)的所有子节点
// <title>数据结构</title>
// < author > 严蔚敏 </ author >
// < price > 30.00 </ price >
XmlNodeList allbookchild = xle.ChildNodes;
//firstbook:数据结构
var firstbook = allbookchild.Item(0).InnerText;
//secbook:严蔚敏
var secbook = allbookchild.Item(1).InnerText;
//thirdbook:30.00
var thirdbook = allbookchild.Item(2).InnerText;
}
注意:注释也是一种结点类型,在没有特别说明的情况下,会默认它也是一个结点(Node).所以在把结点转换成元素的时候就会报错."无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”。
在读取的时候,告诉编译器让它忽略掉里面的注释信息。最后读取完毕后,记得要关掉reader.
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释
XmlReader reader = XmlReader.Create(@"..\..\Book.xml", settings);
xmlDoc.Load(reader);
//对xml文档的一些处理
///
//最后读取完毕后,记得要关掉reader.
reader.Close();
1.2 新增加点
向文件中添加新的数据的时候,首先也是通过XmlDocument加载整个文档,然后通过调用SelectSingleNode方法获得根结点,通过CreateElement方法创建元素,用CreateAttribute创建属性,用AppendChild把当前结点挂接在其它结点上,用SetAttributeNode设置结点的属性.
加载文件并选出根结点/要操作的节点:
//向已有的文件上追加数据
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Ruoqi\source\repos\XmlLearn\example.xml");
//root为根节点
XmlNode root = doc.SelectSingleNode("bookstore");
//创建一个book结点,并设置结点的属性:
XmlElement xelKey = doc.CreateElement("book");
XmlAttribute xelType = doc.CreateAttribute("data");
xelType.InnerText = "新增节点book并且带有一个属性data";
xelKey.SetAttributeNode(xelType);
//为上面新创建的book结点创建子结点:
XmlElement xelAuthor = doc.CreateElement("author");
xelAuthor.InnerText = "托夫斯基";
xelKey.AppendChild(xelAuthor);
//最后把book结点挂接在要新增结点的位置,并保存整个文件
root.AppendChild(xelKey);
doc.Save(@"C:\Users\Ruoqi\source\repos\XmlLearn\example.xml");
用上面的方法,是向已有的文件上追加数据,如果想覆盖原有的所有数据,可以更改一下,使用LoadXml方法 。接把根结点选择出来了,后面不用SelectSingleNode方法选择根结点,直接创建结点即可,代码同上
XmlDocument doc = new XmlDocument();
doc.LoadXml("<bookstore></bookstore>");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据
1.3 删除节点
想要删除某一个结点,直接找到其父结点,然后调用RemoveChild方法即可,现在关键的问题是如何找到这个结点,上面的SelectSingleNode可以传入一个Xpath表,我们通过书的ISBN号来找到这本书所在的结点.如下:
"/bookstore/book[@ISBN=\"{0}\"]"是一个Xpath表达式,找到ISBN号为所选那一行ISBN号的那本书
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\Users\Ruoqi\source\repos\XmlLearn\example.xml");
//DocumentElement获取xml文档对象的根XmlElement.
XmlElement xe = xmlDoc.DocumentElement;
string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", "7-111-19149-3");
//selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
selectXe.ParentNode.RemoveChild(selectXe);
1.4 修改节点
修改某条数据的话,首先也是用Xpath表达式找到所需要修改的那一个结点,然后如果是元素的话,就直接对这个元素赋值,如果是属性的话,就用SetAttribute方法设置即可.如下:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\Users\Ruoqi\source\repos\XmlLearn\example.xml");
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", "111");
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
selectXe.SetAttribute("Type", "A");//也可以通过SetAttribute来增加一个属性
selectXe.GetElementsByTagName("title").Item(0).InnerText = "标题";
selectXe.GetElementsByTagName("author").Item(0).InnerText = "作者";
selectXe.GetElementsByTagName("price").Item(0).InnerText = "价格";
xmlDoc.Save(@"C:\Users\Ruoqi\source\repos\XmlLearn\example.xml");