当前位置:首页 > C#学习 > 正文内容

C# XML操作,创建,追加,读取,删除

小道5年前 (2019-01-12)C#学习7219

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件。

在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。

使用XmlDocument是一种基于文档结构模型的方式来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性.

在C#.net中操作XML,需要添加的命名空间:using System.Xml;

1.XmlDocument类的属性

XmlDocument类的属性及说明如下表所示。

属性

说明

Attributes

当前节点的属性集合

BaseURI

当前节点的基URI

ChildNodes

节点的所有子节点

DocumentElement

文档的根

DocumentType

DOCTYPE 声明的节点

FirstChild

节点的第一个子节点

HasChildNodes

是否有任何子节点

Implementation

获取当前文档的 XmlImplementation对象

InnerText

节点包含的所有文本内容

InnerXml

节点所包含的所有XML内容

IsReadOnly

当前节点是否是只读的

Item

获取指定的子元素

LastChild

最后一个子节点

LocalName

获取节点的本地名称

Name

获取节点的限定名

NamespaceURI

获取该节点的命名空间 URI

NameTable

获取与此实现关联的 XmlNameTable

NextSibling

获取紧接在该节点之后的节点

NodeType

获取当前节点的类型

OuterXml

获取表示此节点及其所有子节点的标记

OwnerDocument

获取当前节点所属的 XmlDocument

ParentNode

获取该节点(对于可以具有父级的节点)的父级

Prefix

获取或设置该节点的命名空间前缀

PreserveWhitespace

获取或设置一个值,该值指示是否在元素内容中保留空白

PreviousSibling

获取紧接在该节点之前的节点

SchemaInfo

返回节点的后架构验证信息集 (PSVI)

Schemas

获取或设置与此 XmlDocument 关联的 XmlSchemaSet 对象

Value

获取或设置节点的值

XmlResolver

设置 XmlResolver 以用于解析外部资源

2.XmlDocument类的方法

XmlDocument类的方法及说明如下表所示。

方法

说明

AppendChild

将指定的节点添加到该节点的子节点列表的末尾

CreateAttribute

创建具有指定名称的 XmlAttribute

CreateCDataSection

创建包含指定数据的 XmlCDataSection

CreateComment

创建包含指定数据的 XmlComment

CreateDocumentFragment

创建 XmlDocumentFragment

CreateDocumentType

返回新的 XmlDocumentType 对象

CreateElement

创建 XmlElement

CreateEntityReference

创建具有指定名称的 XmlEntityReference

CreateNavigator

创建一个用于导航此文档的新 XPathNavigator 对象

CreateNode

创建 XmlNode

CreateProcessingInstruction

创建一个具有指定名称和数据的 XmlProcessingInstruction

CreateSignificantWhitespace

创建一个 XmlSignificantWhitespace 节点

CreateTextNode

创建具有指定文本的 XmlText

CreateWhitespace

创建一个 XmlWhitespace 节点

CreateXmlDeclaration

创建一个具有指定值的 XmlDeclaration 节点

GetElementById

获取具有指定 ID 的 XmlElement

GetElementsByTagName

返回一个 XmlNodeList ,它包含与指定名称匹配的所有元素的列表

GetNamespaceOfPrefix 

查找当前节点范围内离给定的前缀最近的 xmlns 声明,并返回声明中的命名空间 URI

GetPrefixOfNamespace 

查找当前节点范围内离给定的命名空间 URI 最近的 xmlns 声明,并返回声明中定义的前缀

GetType

获取当前实例的 Type

ImportNode

将节点从另一个文档导入到当前文档

InsertAfter

将指定的节点紧接着插入指定的引用节点之后

InsertBefore

将指定的节点紧接着插入指定的引用节点之前

Load

加载指定的 XML 数据

LoadXml

从指定的字符串加载 XML 文档

Normalize 

将XmlText 节点都转换成“正常”形式

PrependChild 

将指定的节点添加到该节点的子节点列表的开头

ReadNode

根据 XmlReader 中的信息创建一个 XmlNode 对象。读取器必须定位在节点或属性上

RemoveAll 

移除当前节点的所有子节点和/或属性

RemoveChild 

移除指定的子节点

ReplaceChild 

用新节点替换旧节点

Save

将 XML 文档保存到指定的位置

SelectNodes 

选择匹配XPath 表达式的节点列表

SelectSingleNode 

选择匹配 XPath 表达式的第一个 XmlNode

Supports 

测试 DOM 实现是否实现特定的功能

Validate

验证 XmlDocument 是不是 Schemas 属性中包含的 XML 架构定义语言 (XSD) 架构。

WriteContentTo

将 XmlDocument 节点的所有子级保存到指定的 XmlWriter 中

WriteTo

将 XmlDocument 节点保存到指定的 XmlWriter

常用的方法。

1)Load方法

该方法可以从一个字符串指定的XML文件或是一个流对象、一个TextReader对象、一个XmlReader对象导入XML数据。

2)LoadXml方法

该方法完成从一个特定的XML文件导入XML数据的功能。默认情况下,LoadXml 方法既不保留空白,也不保留有意义的空白。此方法不执行 DTD 或架构验证。

3)Save方法

该方法将XML数据保存到一个XML文件或是一个流对象、一个TextReader对象、一个XmlReader对象导入XML数据。

3.XmlDocument类的事件

XmlDocument类的事件及说明如下表所示。

表 XmlDocument类的事件及说明

事件

说明

NodeChanged

当属于该文档的节点的 Value已被更改时发生

NodeChanging

当属于该文档的节点的 Value 将被更改时发生

NodeInserted

当属于该文档的节点已被插入另一个节点时发生

NodeInserting

当属于该文档的节点将被插入另一个节点时发生

NodeRemoved

当属于该文档的节点已被从其父级移除时发生

NodeRemoving

当属于该文档的节点将被从文档中移除时发生


创建XML代码:

using System;
using System.Xml;//XML 命名空间 引用

namespace 创建XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//实例化 XML 文档。
            XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);//xml 声明节点
            doc.AppendChild(dec);//将指定的节点添加到该节点的子节点列表的末尾。
            XmlElement 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 = "20元";//值
            book.AppendChild(price);//添加

            XmlElement des = doc.CreateElement("des");//创建元素
            des.InnerText = "入门经典.";//值
            book.AppendChild(des);//添加
            //以下创建 另一套
            XmlElement book1 = doc.CreateElement("book");
            books.AppendChild(book1);
            XmlElement name1 = doc.CreateElement("name");
            name1.InnerText = "睡前小故事";
            book1.AppendChild(name1);
            XmlElement price1 = doc.CreateElement("price");
            price1.InnerText = "10元";
            book1.AppendChild(price1);
            XmlElement des1 = doc.CreateElement("des");
            des1.InnerText = "儿童读物";
            book1.AppendChild(des1);

            doc.Save("Books.xml");//保存XML到指定文件
            Console.WriteLine("保存成功!");//提示
            Console.ReadKey();
        }
    }
}

生成结果:

image.png


创建带属性的XML代码:

using System;
using System.Xml;

namespace 创建带属性的XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//实例化 XML
            XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);//xml 声明节点
            doc.AppendChild(dec);//添加
            
            XmlElement order = doc.CreateElement("Order");//元素
            doc.AppendChild(order);//添加

            XmlElement name = doc.CreateElement("name");//元素
            name.InnerText = "小道";//值
            order.AppendChild(name);//添加

            XmlElement number = doc.CreateElement("Number");//元素
            number.InnerText = "10001";//值
            order.AppendChild(number);//添加

            XmlElement items = doc.CreateElement("Items");//元素
            order.AppendChild(items);//添加

            XmlElement orderItem = doc.CreateElement("OrderItem");//元素
            orderItem.SetAttribute("name", "小猪佩奇CD");//设置 属性
            orderItem.SetAttribute("Count", "10");//设置 属性
            items.AppendChild(orderItem);//添加

            XmlElement orderItem1 = doc.CreateElement("OrderItem");//元素
            orderItem1.SetAttribute("name", "C#学习教程");//设置 属性
            orderItem1.SetAttribute("Count", "3");//设置 属性
            items.AppendChild(orderItem1);//添加

            doc.Save("Order.xml");//保存
            Console.WriteLine("保存成功");//提示
            Console.ReadKey();
        }
    }
}

生成结果:


image.png

InnerText 和 InnerXml区别:

            XmlElement innerText = doc.CreateElement("InnerText");//元素
            innerText.InnerText = "<p>Text的P标签</p>";//获取或设置节点及其所有子级的串联值。
            order.AppendChild(innerText);//添加
            XmlElement innerXml = doc.CreateElement("InnerXml");//元素
            innerXml.InnerXml = "<p>Xml的P标签</p>";//获取或设置只表示此节点子级的标记。
            order.AppendChild(innerXml);//添加

生成结果:

image.png

追加XML代码:

using System;
using System.Xml;
using System.IO;

namespace 追加XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//实例化
            XmlElement books;//元素
            if (File.Exists("Books.xml"))//判断 Books.xml 是否存在
            {
                doc.Load("Books.xml");//加载 Books.xml
                books = doc.DocumentElement;// 获取 XML 根
            }
            else
            {
                XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);//声明节点
                doc.AppendChild(dec);//添加
                books = doc.CreateElement("Books");//创建元素
                doc.AppendChild(books);//添加
            }
            XmlElement name = doc.CreateElement("name");//创建元素
            name.InnerText = "C#基础教程";//值
            books.AppendChild(name);//添加

            XmlElement price = doc.CreateElement("price");//创建元素
            price.InnerText = "198元";//值
            books.AppendChild(price);//添加

            doc.Save("Books.xml");//保存
            Console.WriteLine("保存成功");//提示
            Console.ReadKey();
        }
    }
}

生成结果:

image.png


简单读取XML文档值:

using System;
using System.Xml;

namespace 读取XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//实例化
            doc.Load("Books.xml");//加载
            XmlElement books = doc.DocumentElement;//获取根
            XmlNodeList xnl =  books.ChildNodes;//获取节点的所有子节点。
            foreach (XmlNode item in xnl)//循环
            {
                Console.WriteLine(item.InnerText+"\r\n");//读取
            }
            Console.ReadKey();
        }
    }
}

image.png

生成结果:

image.png

读取带属性的xml:

using System;
using System.Xml;

namespace 读取带属性XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//实例化
            doc.Load("Order.xml");//读取
            XmlNodeList xnl = doc.SelectNodes("Order/Items/OrderItem");//选择匹配 XPath 表达式的节点列表。
            foreach (XmlNode node in xnl)//循环
            {
                Console.WriteLine(node.Attributes["name"].Value);//获取 知道 属性名的值
                Console.WriteLine(node.Attributes["Count"].Value);//获取 知道 属性名的值
            }
            Console.ReadKey();
        }
    }
}

image.png

生成结果:

image.png

删除XML节点:

image.png

using System;
using System.Xml;

namespace 删除XML节点
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//实例化
            doc.Load("Order.xml");//加载
            XmlNode xn = doc.SelectSingleNode("/Order/Items");//选择匹配 XPath 表达式的第一个 XmlNode。
            xn.RemoveAll();//移除当前节点的所有子节点和/或特性。
            doc.Save("Order.xml");//保存
            Console.WriteLine("删除成功。");//提示
            Console.ReadKey();
        }
    }
}

生成结果:

image.png

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://daobk.com/post/170.html

标签: XML
分享给朋友:

“C# XML操作,创建,追加,读取,删除” 的相关文章

foreach语句:依次读取数组中的元素。

foreach语句:依次读取数组中的元素。

foreach和for的区别:for可以不逐个遍历,比如每隔一个遍历一个,或者可以从后向前遍历。只能(只应该)在foreach对集合进行读,而不应该写。foreach语句:依次读取数组中的元素。         ...

字符串的处理练习

字符串的处理练习

接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。            Console.WriteLine("请输入一个字符串");//提示用户输入一...

函数的ref、out参数

函数的ref、out参数

函数参数默认是值传递的,也就是“复制一份”ref必须先初始化,因为是引用,所以必须先“有”,才能引用,而out则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用。ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。  ...

构造函数

构造函数

构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数是用来创建对象的特殊函数,函数名和类名一样,没有返回值,连void都不用。构造函数可以有参数,new对象的时候传递函数参数即可构造函数可以重载,也就是有多个参数不同的构造函数。如果不指定构造函数,则类有一个默认的无参构造函数。如果指...

评论列表

招投标
3年前 (2021-02-23)

文章很不错 欢迎回访我

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。