您的位置:首页 > 其它

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

2015-07-05 00:37 447 查看
<>

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();
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: