C# XML操作,创建,追加,读取,删除
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(); } } }
生成结果:
创建带属性的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(); } } }
生成结果:
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);//添加
生成结果:
追加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(); } } }
生成结果:
简单读取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(); } } }
生成结果:
读取带属性的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(); } } }
生成结果:
删除XML节点:
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(); } } }
生成结果: