C#XML(三) - XmlDocument

本文详细介绍了如何使用XmlDocument类进行XML文档的操作,包括加载XML文件、读取节点、添加新节点、删除节点以及修改节点内容。通过XPath表达式定位节点,并提供了实例代码展示具体步骤。示例中展示了读取书籍信息、新增书籍、删除书籍和更新书籍详情的过程。
摘要由CSDN通过智能技术生成

 使用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");

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值