XML 指可扩展标记语言(EXtensible Markup Language),类似与HTML。XML不能替代HTML,他们为不同的目的而设计,XML被用来传输和存储数据而HTML被用来显示数据。它没有自定义的标签,需要我们自行创建标签。

如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。

在XML中对大小写敏感,每个标签必须有关闭标签而且得正确嵌套,在HTML中有时没有正确嵌套或者没有写关闭标签,在XML中这可是行不通的!在 XML 中,有 5 个预定义的实体引用:

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 单引号
&quot; " 引号

假设我们需要设计出这样的一个xml文件来存储相应的信息,如下所示: 

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author>
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <price>29.99</price> 
</book>
</bookstore>

那么如何生成这个xml文件?又怎么读取这个xml文件的节点信息,以及如何对这个xml文件的节点信息作相应的操作?请看如下代码示例:

1.生成xml文件

privatestaticvoid GenerateXMLFile(string xmlFilePath)
 {
 try
 {
 //初始化一个xml实例
 XmlDocument myXmlDoc =new XmlDocument();
 //创建xml的根节点
 XmlElement rootElement = myXmlDoc.CreateElement("bookstore");
 //将根节点加入到xml文件中(AppendChild)
 myXmlDoc.AppendChild(rootElement);
 
 //初始化第一层的第一个子节点
 XmlElement firstLevelElement1 = myXmlDoc.CreateElement("book");
 //填充第一层的第一个子节点的属性值(SetAttribute)
 firstLevelElement1.SetAttribute("category", "COOKING");
 //将第一层的第一个子节点加入到根节点下
 rootElement.AppendChild(firstLevelElement1);
 //初始化第二层的第一个子节点
 XmlElement secondLevelElement11 = myXmlDoc.CreateElement("title");
 //填充第二层的第一个子节点的属性值
 secondLevelElement11.SetAttribute("lang", "en");
 //填充第二层的第一个子节点的值(InnerText)
 secondLevelElement11.InnerText ="Everyday Italian";
 firstLevelElement1.AppendChild(secondLevelElement11);
 XmlElement secondLevelElement12 = myXmlDoc.CreateElement("author");
 secondLevelElement12.InnerText ="Giada De Laurentiis";
 firstLevelElement1.AppendChild(secondLevelElement12);
 XmlElement secondLevelElement13 = myXmlDoc.CreateElement("price");
 secondLevelElement13.InnerText ="30.00";
 firstLevelElement1.AppendChild(secondLevelElement13);
 
 //初始化第一层的第二个子节点
 XmlElement firstLevelElement2 = myXmlDoc.CreateElement("book");
 firstLevelElement2.SetAttribute("category", "CHILDREN");
 rootElement.AppendChild(firstLevelElement2);
 XmlElement secondLevelElement21 = myXmlDoc.CreateElement("title");
 secondLevelElement21.SetAttribute("lang", "en");
 secondLevelElement21.InnerText ="Harry Potter";
 firstLevelElement2.AppendChild(secondLevelElement21);
 XmlElement secondLevelElement22 = myXmlDoc.CreateElement("author");
 secondLevelElement22.InnerText ="J K. Rowling";
 firstLevelElement2.AppendChild(secondLevelElement22);
 XmlElement secondLevelElement23 = myXmlDoc.CreateElement("price");
 secondLevelElement23.InnerText ="29.99";
 firstLevelElement2.AppendChild(secondLevelElement23);
 //将xml文件保存到指定的路径下
 myXmlDoc.Save(xmlFilePath);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.ToString());
 }
 }

2.遍历xml文件的信息

private static void GetXMLInformation(string xmlFilePath)
 {
 try
 {
 //初始化一个xml实例
 XmlDocument myXmlDoc =new XmlDocument();
 //加载xml文件(参数为xml文件的路径)
 myXmlDoc.Load(xmlFilePath);
 //获得第一个名称匹配的节点(SelectSingleNode):此xml文件的根节点
 XmlNode rootNode = myXmlDoc.SelectSingleNode("bookstore");
 //分别获得该节点的InnerXml和OuterXml信息
 string innerXmlInfo = rootNode.InnerXml.ToString();
 string outerXmlInfo = rootNode.OuterXml.ToString();
 //获得该节点的子节点(即:该节点的第一层子节点)
 XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
 foreach (XmlNode node in firstLevelNodeList)
 {
 //获得该节点的属性集合
 XmlAttributeCollection attributeCol = node.Attributes;
 foreach (XmlAttribute attri in attributeCol)
 {
 //获取属性名称与属性值
 string name = attri.Name;
 string value = attri.Value;
 Console.WriteLine("{0} = {1}", name, value);
 }
 
 //判断此节点是否还有子节点 备注:此处还可用foreach(XmlNode childNode in node.ChildNodes){...}遍历输出子节点
 if (node.HasChildNodes)
 {
 //获取该节点的第一个子节点 
 XmlNode secondLevelNode1 = node.FirstChild;
 //获取该节点的名字
 string name = secondLevelNode1.Name;
 //获取该节点的值(即:InnerText)
 string innerText = secondLevelNode1.InnerText;
 Console.WriteLine("{0} = {1}", name, innerText);
 
 //获取该节点的第二个子节点(用数组下标获取)
 XmlNode secondLevelNode2 = node.ChildNodes[1];
 name = secondLevelNode2.Name;
 innerText = secondLevelNode2.InnerText;
 Console.WriteLine("{0} = {1}", name, innerText);
 }
 }
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.ToString());
 }
 }

private static void ModifyXmlInformation(string xmlFilePath)
 {
 try
 {
 XmlDocument myXmlDoc =new XmlDocument();
 myXmlDoc.Load(xmlFilePath);
 XmlNode rootNode = myXmlDoc.FirstChild;
 XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
 foreach (XmlNode node in firstLevelNodeList)
 {
 //修改此节点的属性值
 if (node.Attributes["category"].Value.Equals("COOKING"))
 {
 node.Attributes["category"].Value ="WEB";
 }
 }
 //要想使对xml文件所做的修改生效,必须执行以下Save方法
 myXmlDoc.Save(xmlFilePath);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.ToString());
 }
 }

3.修改xml文件的信息

private static void AddXmlInformation(string xmlFilePath)
 {
 try
 {
 XmlDocument myXmlDoc =new XmlDocument();
 myXmlDoc.Load(xmlFilePath);
 //添加一个带有属性的节点信息
 foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
 {
 XmlElement newElement = myXmlDoc.CreateElement("year");
 newElement.InnerText ="2005";
 node.AppendChild(newElement);
 }
 //保存更改
 myXmlDoc.Save(xmlFilePath);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.ToString());
 }
 }

4.删除指定节点信息

 

private static void DeleteXmlInformation(string xmlFilePath)
 {
 try
 {
 XmlDocument myXmlDoc =new XmlDocument();
 myXmlDoc.Load(xmlFilePath);
 foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
 {
 //记录该节点下的最后一个子节点(简称:最后子节点)
 XmlNode lastNode = node.LastChild;
 //删除最后子节点下的左右子节点
 lastNode.RemoveAll();
 //删除最后子节点
 node.RemoveChild(lastNode);
 }
 //保存对xml文件所做的修改
 myXmlDoc.Save(xmlFilePath);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.ToString());
 }
 }
 }
 }

最后简单集中的总结一下对xml进行操作的基本方法:

//所需要添加的命名空间
using System.Xml;
//初始化一个xml实例
XmlDocument xml=new XmlDocument();
//导入指定xml文件
xml.Load(“xml文件路径path”);
//指定一个节点
XmlNode root=xml.SelectSingleNode("节点名称");
//获取节点下所有直接子节点
XmlNodeList childlist=root.ChildNodes;
//判断该节点下是否有子节点
root.HasChildNodes;
//获取同名同级节点集合
XmlNodeList nodelist=xml.SelectNodes("节点名称");
//生成一个新节点
XmlElement node=xml.CreateElement("节点名称");
//将节点加到指定节点下,作为其子节点
root.AppendChild(node);
//将节点加到指定节点下某个子节点前
root.InsertBefore(node,root.ChildeNodes[i]);
//为指定节点的新建属性并赋值
node.SetAttribute("id","11111");
//为指定节点添加子节点
root.AppendChild(node);
//获取指定节点的指定属性值
string id=node.Attributes["id"].Value;
//获取指定节点中的文本
string content=node.InnerText;
//保存XML文件
xml.Save(“xml文件存储的路径path”);