xml文件是我们程序员经常打交道的一种文件,通常情况下我们用它来存储连接数据库的字符串,加解密的密钥等系统配置信息。因此,对于xml文件的操作是非常重要的。最近我在项目中也有大量对于xml文件的操作,对xml的操作进行了整理。(由于本人经验欠缺,整理的不好,欢迎大家拍砖。)
一、XmlNode与XmlElement的区别
我在整理过程中,发现分不清XmlNode与XmlElement两个类,不知道什么时候使用XmlNode,什么情况下使用XmlElement,他们两个的功能相当类似,于是我研究了一下,总结如下:
1.通过查询MSDN会发现如下集成层次结构,由下图看以看出XmlElement继承自XmlNode。根据类之间的继承关系,我们可以知道,XmlNode所拥有的方法和属性,在XmlElement类中也是可以使用的。
2.XmlNode类是一个抽象类,而XmlElement是一个具体类,它们的定义如下,XmlNode类对象必须通过XmlDocument实例通过调用CreateNode方法来创建。
public abstract class XmlNode : ICloneable, IEnumerable, IXPathNavigable
public class XmlElement : XmlLinkedNode
3.MSDN对XmlNode的解释为Represents a single node in the XML document(表示XML文档中的单个节点),对XmlElement的解释为Represents an element(表示一个元素)。先来解释一下节点与元素两个概念之间的关系:引用一下w3c的原话 A node can be an element node, an attribute node, a text node, or any other of the node types explained in the “Node types” chapter,所以说Element是一种特殊的Node,但是Node并不一定是Element,这一点从上面的继承关系图也可以总结出来。
4.XmlElement相比XmlNode拥有众多Attribute的操作方法,可以很方便的对其属性进行操作,XmlNode可以通过Attributes属性来获取其属性列表。
来看段xml的内容:
<?xml version="1.0" encoding="utf-8"?>
<root>
<user gender="male">
<name>rayson</name>
<age>24</age>
</user>
</root>
其中:root是xml文件的根节点,user是root节点的子节点,gender是属性,name和age是user节点的子节点。
二、XML文档结构解析
我将根据上述xml结构,对其进行解析,并对其创建过程进行阐述。
首先,我们看到的是整个xml文档,里面包含了很多节点,要想创建这样一个文档结构,必须先有一个容器来容纳这些节点信息,在C#中这个文档容器就是XmlDocument,可以用如下代码来创建:
XmlDocument xml = new XmlDocument();
1.文档的声明
<?xml version="1.0" encoding="utf-8"?>
这是xml文件的声明部分,它定义 XML 的版本 (1.0) 和所使用的编码方式(utf-8)。在C#中你可以使用下面的代码来创建:
XmlNode xmlNode = xml.CreateXmlDeclaration("1.0", "utf-8", "");
xml.AppendChild(xmlNode);
2.根节点
标准的XML 文档必须包含根元素,该元素是所有其他元素的父元素,该例子中<root></root>就是根节点,创建代码如下:
XmlNode root = xml.CreateNode(XmlNodeType.Element, "root", "");
//XmlNode root = xml.CreateNode("element", "root", "");
xml.AppendChild(root);//上面两种方式都可以
3.含有属性的节点
在节点 <user gender=”male”></user>中,gender=”male”是含有属性的节点,根据上面对XmlElement的介绍,我们知道可以使用Element来创建该类型的节点:
XmlElement ele = xml.CreateElement("", "user", "");
ele.SetAttribute("gender", "male");
root.AppendChild(ele);
4.普通文本节点
文档中user的两个子节点“<name>rayson</name><age>24</age>”是我们最常用的文本节点,为我们的开发提供了强大的扩展空间,这个时候我们一般使用XmlText或者ele.InnerText来实现:
XmlElement ele1 = xml.CreateElement("","name","");
XmlText text = xml.CreateTextNode("rayson");
ele1.AppendChild(text);
ele.AppendChild(ele1);
XmlElement ele2 = xml.CreateElement("", "age", "");
ele2.InnerText = "24";
ele.AppendChild(ele2);
下面是完整的代码:
string test = System.Environment.CurrentDirectory + "config\test.xml";
XmlDocument xml = new XmlDocument();
XmlNode xmlNode = xml.CreateXmlDeclaration("1.0", "utf-8", "");
xml.AppendChild(xmlNode);
//XmlNode root = xml.CreateElement("", "root", "");
XmlNode root = xml.CreateNode(XmlNodeType.Element, "root", "");
//XmlNode root = xml.CreateNode("element", "root", "");
xml.AppendChild(root);
XmlElement ele = xml.CreateElement("", "user", "");
ele.SetAttribute("gender", "male");
root.AppendChild(ele);
XmlElement ele1 = xml.CreateElement("","name","");
XmlText text = xml.CreateTextNode("rayson");
ele1.AppendChild(text);
ele.AppendChild(ele1);
XmlElement ele2 = xml.CreateElement("", "age", "");
ele2.InnerText = "24";
ele.AppendChild(ele2);
xml.Save(test);