XML文档追加内容,查找(读取)内容 ,删除内容

<>

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念