C#.Net操作XML文件的数据

来源:互联网 发布:微信公众号sdk php 编辑:程序博客网 时间:2024/05/15 04:11

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文件内容:

C.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go On

输出的结果:

查询:

C.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go On

更改:

C.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go OnC.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go On

添加:

C.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go OnC.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go On

删除:

C.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go OnC.Net操作XML文件的数据 - lining820125 - 程序天空 Will Go On