XML文件作为数据数据存储介质的一种,好处在于:任何的系统均可以解析它。
XML全称:Extensible Markup Language(扩展标记语言)使用文档类型定义(DTD)或者模式(Schema)来描述数据的。可供人阅读,而且还基于一种公共的开发标准。
最近由于开发的需要,也是研究以下XML的操作,本篇日志主要总结C#.NET中是如何操作XML文件的。
.NET Framework为我们提供了操作XML文件的类,主要封装在System.Xml命名空间中。
接下来我们看看如何通过程序来访问XML文件:
主要是利用System.Xml.XmlDocument类以及一些相关类来完成访问数据过程。
请大家自己去了解一下XML的结构,在这里不做讲述。
System.Xml的属性以及方法如下:
InnerText和InnerXml:找到与各自子节点相关的值或者标记;
Value:访问节点的值;
Attributes:获取当前节点的属性集合;
FirstChild、LastChild和ChildNodes:获取第一个节点、最后一个节点或者子节点的集合;
NextSibling和PreviousSibling:立刻访问下一个或上一个同级子节点;
DocumentElement:访问文件的根元素;
Item:获取指定的子节点;
NodeType:指明当前节点的类型;
XmlNodeType:枚举出所有可能的节点类型;
GetElementsByTagName或GetElementById:获取一个或多个指定的XML元素。
首先,我们创建一个XML文档(名字为:test.xml 路径:f:/studysum/ASP-XML/下面):
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Collection>
<Book id="1" ISBN="1-100000ABC-200">
<Title>Principle of Reletivity</Title>
<Author>Einstan</Author>
<Genre>Physics</Genre>
</Book>
<Book id="2" ISBN="1-100000ABC-300">
<Title>Cosmos</Title>
<Author>Sapan</Author>
<Genre>Cosmology</Genre>
</Book>
</Collection>
创建C#程序,对此XML文件的数据进行增删改查(使用ASP.NET来实现的):
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Text;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
/// <summary>
/// 获取xml节点类型数
/// </summary>
/// <param name="node">节点</param>
/// <param name="nodetype">节点类型</param>
/// <returns>节点类型数</returns>
public static int GetNodeTypCount(XmlNode node,XmlNodeType nodetype)
{
int i = 0;
if (node.NodeType == nodetype)
i++;
if (node.HasChildNodes) //如果存在子节点
foreach (XmlNode cnode in node.ChildNodes)
i += GetNodeTypCount(cnode,nodetype);
return i;
}
protected void Button1_Click(object sender, EventArgs e)
{
try
{
XmlNode rnode;
//穿件xmldocument实例并且加载Xml数据
XmlDocument doc = new XmlDocument();
doc.Load("F://studysum//ASP-XML//test.xml");
//1、利用XPath查询所有的图书标题
XmlNodeList nodelist = doc.SelectNodes("/Collection/Book/Title");
Response.Write("<b>图书列表:</b><br>");
foreach (XmlNode node in nodelist)
Response.Write(node.InnerText + "<br>");
//2、读取XmlDeclaration的值
XmlDeclaration dec = (XmlDeclaration)doc.FirstChild;
Response.Write("<b>XML DECLARATION:</b><BR>");
Response.Write("Version:" + dec.Version + "<br>");
Response.Write("Encoding:" + dec.Encoding + "<br>");
Response.Write("Standalone:" + dec.Standalone + "<br>");
//3、进入DOM的第一个节点,并获去它的所有属性
XmlElement root = doc.DocumentElement;
rnode = root.FirstChild;
Response.Write("<b>第一个子节点的所有属性:</b><br>");
Response.Write("子节点名称:" + rnode.Name + "<br>");
foreach (XmlAttribute attr in rnode.Attributes)
Response.Write(attr.Name + ":" + attr.InnerText + "<br>");
//4、输出第一个节点的子节点
Response.Write("<b>第一个节点的子节点:</b><br>");
if (rnode.HasChildNodes)
foreach (XmlNode cnode in rnode.ChildNodes)
Response.Write(rnode.OuterXml + "<br>");
// 5. 第一个节点的下一个同级节点的内容
rnode = rnode.NextSibling;
Response.Write("<b>第一个节点的下一个同级节点:</b><br>");
if (rnode != null)
Response.Write(rnode.OuterXml + "<br>");
// 6. 获取当前节点的父节点详细信息
Response.Write("父节点的名字 = " + rnode.ParentNode.Name + "<br>");
Response.Write("父节点共有" + rnode.ParentNode.ChildNodes.Count + "个子节点<br>");
Response.Write("父节点的命名空间:" + rnode.ParentNode.NamespaceURI + "<br>");
// 7.文件中条目的数目
// 你用同样的方法还可以找到其他的类型
int commentNodes = _Default.GetNodeTypCount(doc.DocumentElement, XmlNodeType.Comment);
Response.Write("文件中目录节点数目:" + commentNodes + "<br>");
}
catch (Exception ex)
{
Response.Write("出错了");
}
}
/// <summary>
/// 更改Xml文件的数据
/// Modification
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
try
{
//1、将Book标签的id属性值均加100
XmlDocument doc = new XmlDocument();
doc.Load("F://studysum//ASP-XML//test.xml");
XmlNodeList nodelist = doc.SelectNodes("//Book");
foreach (XmlNode node in nodelist)
node.Attributes["id"].Value = (Int32.Parse(node.Attributes["id"].Value) + 100).ToString();
doc.PreserveWhitespace = true;
XmlTextWriter writer = new XmlTextWriter("F://studysum//ASP-XML//test.xml",Encoding.UTF8);
doc.WriteTo(writer);
writer.Close();
Button1_Click(sender,e);
}
catch (Exception ex)
{
Response.Write("出错了!");
}
}
/// <summary>
/// 添加数据
/// Addition
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button3_Click(object sender, EventArgs e)
{
try
{
XmlDocument doc = new XmlDocument();
doc.Load("F://studysum//ASP-XML//test.xml");
//创建Book节点元素
XmlElement newelem = doc.CreateElement("Book"); ;
//添加属性
XmlAttribute attr = doc.CreateAttribute("id");
attr.Value = "103";
newelem.Attributes.Append(attr);
//创建子节点,Create Childe Nodes
newelem.InnerXml = "<Title></Title><Author></Author><Genre></Genre>";
newelem["Title"].InnerText = "lining";
newelem.AppendChild(doc.CreateWhitespace("/n"));
newelem["Author"].InnerText = "lining";
newelem.AppendChild(doc.CreateWhitespace("/n"));
newelem["Genre"].InnerText = "ligong";
doc.DocumentElement.AppendChild(newelem);
doc.PreserveWhitespace = true;
XmlTextWriter writer = new XmlTextWriter("F://studysum//ASP-XML//test.xml", Encoding.UTF8);
doc.WriteTo(writer);
writer.Close();
Button1_Click(sender, e);
}
catch (Exception ex)
{
Response.Write("出错了!");
}
}
/// <summary>
/// 删除xml文件的数据
/// Delete
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button4_Click(object sender, EventArgs e)
{
try
{
//1、删除Book标签原属中的Gener节点
XmlDocument doc = new XmlDocument();
doc.Load("F://studysum//ASP-XML//test.xml");
XmlNodeList nodelist = doc.SelectNodes("//Book");
foreach (XmlNode node in nodelist)
node.RemoveChild(node.SelectSingleNode("Genre"));
doc.PreserveWhitespace = true;
XmlTextWriter writer = new XmlTextWriter("F://studysum//ASP-XML//test.xml", Encoding.UTF8);
doc.WriteTo(writer);
writer.Close();
Button1_Click(sender, e);
}
catch (Exception ex)
{
Response.Write("出错了!");
}
}
}
除了查询以外,每一次操作之后将修改后的数据再次写到XML文件中(利用XmlTextWrter实例)。
操作之前的XML文件内容:
输出的结果:
查询:
更改:
添加:
删除: