系列文章目录
C#处理XML 数据的技术方法总结
XmlDocument读取和创建 XML 文档
XmlWriter类提供一种快速非缓存的只进 XML 数据生成方式
XmlReader类提供一种快速非缓存的只进 XML 数据访问方式
LINQ to XML用于访问 XML 数据
XPathNavigator 类对 XmlDocument 和 XPathDocument 中的 XML 提供多个编辑选项和导航功能
XslCompiledTransform 类为使用 XSL 转换进行 XML 数据的转换提供选项
XmlDocument读取和创建 XML 文档
前言
本文主要介绍以XMLDocument方式操作XML文档
一、XML 文档对象模型 (DOM)
XML 文档对象模型 (DOM) 类是 XML 文档的内存中表示形式,即将XML文档以XMLDocument的Load方法加载的时候,XML文档内的所有内容均会加载到内存中,以一个树形结构存在,这个树形结构就是XML文档对象模型。就是说,以DOM方式操作XMl文档时,如果xml文档中有内容,会将内容以树形结构全部载入内存中,如果新建,则直接在内存创建一个树形结构,以后的所有增删改查均对内存中的树形结构操作,操作完毕后,用save方法将整个树形结构插入XML文档中。
有一个XML文档内容如下:
<?xml version="1.0"?>
<books>
<book>
<author>Carson</author>
<price format="dollar">31.95</price>
<pubdate>05/01/2001</pubdate>
</book>
<pubinfo>
<publisher>MSPress</publisher>
<state>WA</state>
</pubinfo>
</books>
下图显示将此 XML 数据读入 DOM 结构中时如何构造内存。
XML 文档结构
在 XML 文档结构中,此图中的每个圆圈表示一个节点(称为 XmlNode 对象)。 XmlNode 对象是 DOM 树中的基本对象。 XmlDocument 类(扩展 XmlNode)支持用于对整个文档执行操作(例如,将文档加载到内存中或将 XML 保存到文件中)的方法。 此外,XmlDocument 提供了查看和处理整个 XML 文档中的节点的方法。 XmlNode 和 XmlDocument 都具有性能和可用性增强,并通过方法和属性执行下列操作:
-
访问和修改 DOM 特定的节点,如元素节点、实体引用节点等。
-
除检索节点包含的信息(如元素节点中的文本)外,还检索整个节点。
二、XML 节点类型以及层次结构
1.在DOM中,一切结节点,元素,属性,文字均是节点。大多数对象都继承自Node,
2.Node 对象具有一组方法和属性以及基本的和定义完善的特性。 其中的某些特性包括:
-
节点有单个父节点,父节点是与节点相邻的上一级节点。 唯一没有父级的节点是文档根,因为它是顶级节点,包含了文档本身和文档片段。
-
大多数节点可以有多个子节点,子节点是与节点相邻的下一级节点。 以下是可以有子节点的节点类型列表。
-
处于同一级别、在关系图中由 book 和 pubinfo 节点表示的节点是同级。
-
属性是不属于父子关系和同级关系的节点。 属性被视为元素节点的属性,由名称和值对组成。 例如,如果存在由与元素 price 关联的 format="dollar" 组成的 XML 数据,则单词 format 是名称,format 属性的值是 dollar。 为检索 price 节点的 format="dollar" 属性,可以在游标位于 price 元素节点时调用 GetAttribute 方法。
当将 XML 文档作为节点树读入内存时,这些节点的节点类型在创建节点时确定。 XML 文档对象模型 (DOM) 具有多种节点类型
DOM 节点类型 | 对象 | 说明 |
---|---|---|
Document | 树中所有节点的容器。 它也称作文档根,文档根并非总是与根元素相同。 | |
DocumentFragment | 包含一个或多个不带任何树结构的节点的临时袋。 | |
DocumentType | 表示 <!DOCTYPE…> 节点。 | |
EntityReference | 表示非扩展的实体引用文本。 | |
Element | 表示元素节点。 | |
Attr | 为元素的属性。 | |
ProcessingInstruction | 为处理指令节点。 | |
Comment | 注释节点。 | |
Text | 属于某个元素或属性的文本。 | |
CDATASection | 表示 CDATA。 | |
Entity | 表示 XML 文档(来自内部文档类型定义 (DTD) 子集或来自外部 DTD 和参数实体)中的 <!ENTITY…> 声明。 | |
Notation | 表示 DTD 中声明的表示法。 |
3.XML 文档对象模型 (DOM) 层次结构
三、Xml文档操作
1、操作xml文档前添加命名空间:
-
using
System.Xml;
2、新建一个XML实例:
-
XmlDocument xml=
new
XmlDocument();
3.加载指定的XMl文档
方法一:Lode方法加载的是XML文件所在的路径
-
xml.Load(path);
方法二:LoadXml方法加载的是XML字符串
-
doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'>" + "<title>The Handmaid's Tale</title>" + "<price>14.95</price>" + "</book>");
4.获取根节点
-
XmlElement myElement = doc.DocumentElement; 创建一个myElement元素,并将doc文档的根元素赋给它
5.获取指定节点
-
//方法一:获取单个节点:如果有筛选到多个符合条件的,默认选第一个 XmlNode node=xmldoc.SelectSingleNode("user"); //方法二:这种方法需要了解节点排列顺序才可以准确的获取想要的节点 XmlNode node=xmldoc.SelectNodes("user").Item(0); //方法三:指定了属性,进一步筛选 XmlNode node=xmldoc.SelectSingleNode("user/person[@name='王五']")//获取user元素下的person元素,其属性name='王五' //方法四 :获取父节点 XmlNode node=myElement.ParentNode; //方法五:获取最后一个子节点 XmlNode lastNode = doc.DocumentElement.LastChild; //方法六:获取第一个子节点 XmlNode currNode = doc.DocumentElement.FirstChild; //方法七:获取前一个同级节点 XmlNode nextNode = currNode.PreviousSibling; //方法八:获取后一个同级节点 XmlNode nextNode = currNode.NextSibling;
6.获取节点集合
-
//方法一:获取user节点下的person节点集合 XmlNodeList nodelist=xmldoc.SelectNodes("user/person"); //方法二:获取user节点下的所有子节点 XmlNodeList nodelist=xmldoc.SelectSingleNode("user").ChildNodes; //方法三:获取根节点下的标签名为person的节点集合 XmlNodeList nodelist=xmlroot.GetElementsByTagName("person") //遍历节点 foreach(XmlNode childNode in nodelist) { Response.Write(childNode .Name); }
7.删除节点
-
//删除其下所有节点和其本身的属性,只剩下标签 xmlroot.RemoveAll(); //删除指定节点,括号里传入的是节点名 xmlroot.RemoveChild(person);
8.创建节点
-
//方法一:利用CreateNode创建元素节点 // 利用CreateNode可以创建任何类型的xml节点,如元素,属性等等 //原型:CreateNode(String, String, String) 可以创建具有指定的节点类型、Name 和 NamespaceURI //的 XmlNode。 //下面创建一个元素节点. XmlNode newElem = doc.CreateNode("element", "pages", ""); //设置元素内文本 newElem.InnerText = "290"; //方法二 :创建根节点 XmlElement xmlroot = xmldoc.CreateElement("user"); xmldoc.AppendChild(xmlroot); //方法三:创建根节点的子节点 XmlElement ePerson=xmldoc.CreateElement("person"); xmlroot.AppendChild(ePerson);
9.增加属性
-
//方法一 设置某个元素的属性 children.SetAttribute("班级","一年级");//设置children元素的属性:班级=“一年级” //方法二: XmlAttribute grade= xmldoc.CreateAttribute("班级"); grade.Value = "二年级"; children.Attributes.Append(grade); //设置文本节点 children.InnerText = "123";
10.更改属性
-
children.Attributes["班级"].Value = "一年级";
11.获取属性值
-
//方法一 string name=children.Attributes["name"].Value.ToString(); //方法二 string name=person.GetAttribute("name").ToString(); //方法三:XmlNode.SelectSingleNode()方法中,节点名加@表示查找属性,但最后要转成(XmlAttribute) XmlAttribute xa = (XmlAttribute)person.SelectSingleNode("@" + name); string name=xa.Value.ToString();
12.删除属性
-
//方法一:删除某个元素的指定属性 children.RemoveAttribute("班级"); //方法二:删除某个元素的指定位置的属性 person.RemoveAttributeAt(0); //方法三:删除所有属性 person.RemoveAllAttributes();
13.保存XML
-
//xe为需要保存的xmlDocument xe.Save(string path);