• 0708:XML专题


    C#读写XML(一)

           XML是一项热门的技术。它之所以能够引起人们的兴趣,一个主要的原因在于它十分的简单,人们可以很容易地理解和使用它。每一个程序员都能轻易地看懂一个XML文件,理解它包含的内容。

           .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。

    在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter类

    XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使用这个类,你必须首先创建一个新的XmlTextWriter对象,然后你可以将XML片断加入到这个对象中。这个类中包含了不少的方法用于将各种类型的XML元素添加到XML文件中。

     

    下表给出了这些方法的名字和描述情况:

    方法描述:

    WriteStartDocument书写版本为“1.0”的 XML 声明

    WriteEndDocument关闭任何打开的元素或属性

    Close关闭流

    WriteDocType写出具有指定名称和可选属性的 DOCTYPE 声明

    WriteStartElement写出指定的开始标记

    WriteEndElement关闭一个元素

    WriteFullEndElement关闭一个元素,并且总是写入完整的结束标记

    WriteElementString写出包含字符串值的元素

    WriteStartAttribute书写属性的起始内容

    WriteEndAttribute关闭上一个 WriteStartAttribute 调用

    WriteRaw手动书写原始标记

    WriteString书写一个字符串

    WriteAttributeString出具有指定值的属性

    WriteCData写出包含指定文本的 <![CDATA[...]]> 块

    WriteComment写出包含指定文本的注释 <!--...-->

    WriteWhiteSpace写出给定的空白

    WriteProcessingInstruction写出在名称和文本之间带有空格的处理指令,如下所示:<?name text?> 如果你对于XML十分熟悉,那么你一定能很好的理解上面的这些方法。

    下面我们将给出一个例子,在这个例子中,我们将先创建一个文档,添加一些元素,然后关闭这个文档。添加了元素后你还可以添加子元素,属性和其他内容。

     

    下面的代码就是这样的一个例子,它创建了一个文件名为title的XML文件。

    using System; using System.IO;

    using System.Xml;

    public class Sample

    {

    public static void Main()

    {

    XmlTextWriter writer = new XmlTextWriter("titles.xml", null);

    //写入根元素

     writer.WriteStartElement("items");

    //加入子元素

    writer.WriteElementString("title", "Unreal Tournament 2003");

    writer.WriteElementString("title", "C&C: Renegade");

    writer.WriteElementString("title", "Dr. Seuss's ABC");

    //关闭根元素,并书写结束标签

    writer.WriteEndElement();

    //将XML写入文件并且关闭

    XmlTextWriter writer.Close();

    }

    }

     

    如果你编译并且执行上面的代码,你将创建这个XML文件,文件中包含如下内容:

    <items>

    <title>Unreal Tournament 2003</title>

    <title> C&amp;C: Renegade</title>

    <title>Dr. Seuss's ABC </title>

    </items>

    上面的代码创建了一个名为writer的XmlTextWriter对象。当这个对象被创建时,它被关联到一个名为titles.xml的文件。接着,程序创建了一个叫做items的根属性,WriteStartElement方法创建了这个属性的开始标签。接下来,程序调用了WriteElementString方法创建了三个子元素。从上面的代码你还可以看到,这个方法使用第一个参数(在上面的程序中是title)作为元素的标签;使用第二个参数作为元素的值。当你添加了所有的元素后,你需要关闭根元素。这时你可以调用WriteEndElement方法关闭那个最近被打开的元素;在本例中,这个最近被打开的元素就是根元素。当所有的数据都已经写好,根元素也已经关闭时,你可以将信息传送给你的XmlTextWriter。这意味着这时候你可以调用Close方法关闭它了。

     

    上面的代码相对十分的简单,下面我们看一个使用了XmlTextWriter类中更多方法,功能更加完善的例子。

    using System; using System.IO;

    using System.Xml;

    public class Sample

    {

    public static void Main()

    {

    XmlTextWriter writer = new XmlTextWriter("myMedia.xml", null);

    //使用自动缩进便于阅读

    writer.Formatting = Formatting.Indented;

    //书写根元素

    writer.WriteStartElement("items");

    //开始一个元素

    writer.WriteStartElement("item");

    //向先前创建的元素中添加一个属性

    writer.WriteAttributeString("rating", "R");

    //添加子元素

    writer.WriteElementString("title", "The Matrix");

    writer.WriteElementString("format", "DVD");

    //关闭item元素

    writer.WriteEndElement();

    // 关闭元素

    //在节点间添加一些空格

    writer.WriteWhitespace("n");

    //使用原始字符串书写第二个元素

    writer.WriteRaw("<item>" + "<title>BloodWake</title>" + "<format>XBox</format>" + "</item>");

    //使用格式化的字符串书写第三个元素

    writer.WriteRaw("n <item>n" + " <title>Unreal Tournament 2003</title>n" + " <format>CD</format>n" + " </item>n");

    // 关闭根元素

    writer.WriteFullEndElement();

    //将XML写入文件并关闭

    writer writer.Close(); }

    }

     

    上面代码编译运行后将得到myMedia.xml文件,文件的内容为:

    <items>

    <item rating="R">

           <title>The Matrix</title>

           <format>DVD</format>

    </item>

    <item>

           <title>BloodWake</title>

           <format>XBox</format>

    </item>

    <item>

           <title>Unreal Tournament 2003</title>

           <format>CD</format>

    </item>

    </items>

     

    上面代码中的注释说明了这个程序的功能是如何实现的。

    需要记住的一件事是:当调用方法开始一个操作时,你需要在程序的合适的地方调用方法结束这个操作。

    例如,你调用了StartElement,你就必须调用EndElement关闭元素;当然在这两个调用之间你也可以加入一个子元素。无论你何时调用EndElement方法,它总是关闭最近使用StartElement方法打开的那个元素(这和栈的工作方式很相似)。

    使用XmlTextWriter十分的容易,不过我还是建议你自己动手试试这些代码和方法。你试过以后会发现这些代码能够很容易地集成到你的程序中。

    你还应该记住,XmlTextWriter仅仅是.NET提供的众多XML类中的一个。和XmlTextWriter一样,其他的XML类也十分的容易使用。

     C#读写XML(二)

    已知有一个XML文件(bookstore.xml)如下:

    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
    </bookstore>

     

    1、往<bookstore>节点中插入一个<book>节点:

       XmlDocument xmlDoc=new XmlDocument();
       xmlDoc.Load("bookstore.xml");

       XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
       XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点
       xe1.SetAttribute("genre","李赞红");//设置该节点genre属性
       xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性

     

       XmlElement xesub1=xmlDoc.CreateElement("title");
       xesub1.InnerText="CS从入门到精通";//设置文本节点
       xe1.AppendChild(xesub1);//添加到<book>节点中
       XmlElement xesub2=xmlDoc.CreateElement("author");
       xesub2.InnerText="候捷";
       xe1.AppendChild(xesub2);
       XmlElement xesub3=xmlDoc.CreateElement("price");
       xesub3.InnerText="58.3";
       xe1.AppendChild(xesub3);

     

       root.AppendChild(xe1);//添加到<bookstore>节点中
       xmlDoc.Save("bookstore.xml");

    //===============================================

    结果为:

    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book genre="李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
      </book>
    </bookstore>

     

    2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。

        XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点
       foreach(XmlNode xn in nodeList)//遍历所有子节点
       {
        XmlElement xe=(XmlElement)xn;//将子节点类型转换为XmlElement类型
        if(xe.GetAttribute("genre")=="李赞红")//如果genre属性值为“李赞红”
        {
         xe.SetAttribute("genre","update李赞红");//则修改该属性为“update李赞红”

     

         XmlNodeList nls=xe.ChildNodes;//继续获取xe子节点的所有子节点
         foreach(XmlNode xn1 in nls)//遍历
         {
          XmlElement xe2=(XmlElement)xn1;//转换类型
          if(xe2.Name=="author")//如果找到
          {
           xe2.InnerText="亚胜";//则修改
           break;//找到退出来就可以了
          }
         }
         break;
        }
       }

     

       xmlDoc.Save("bookstore.xml");//保存。

    //==================================================

    最后结果为:

    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book genre="fantasy" ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book genre="update李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>亚胜</author>
        <price>58.3</price>
      </book>
    </bookstore>

     

    3、删除 <book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除 <book genre="update李赞红" ISBN="2-3631-4">节点。

    XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;

     

       foreach(XmlNode xn in xnl)
       {
        XmlElement xe=(XmlElement)xn;
        if(xe.GetAttribute("genre")=="fantasy")
        {
         xe.RemoveAttribute("genre");//删除genre属性
        }
        else if(xe.GetAttribute("genre")=="update李赞红")
        {
         xe.RemoveAll();//删除该节点的全部内容
        }
       }
       xmlDoc.Save("bookstore.xml");

    //===========================================
    最后结果为:

    <?xml version="1.0" encoding="gb2312"?>
    <bookstore>
      <book ISBN="2-3631-4">
        <title>Oberon's Legacy</title>
        <author>Corets, Eva</author>
        <price>5.95</price>
      </book>
      <book>
      </book>
    </bookstore>

     

    4、显示所有数据。

       XmlNode xn=xmlDoc.SelectSingleNode("bookstore");

     

       XmlNodeList xnl=xn.ChildNodes;
       
       foreach(XmlNode xnf in xnl)
       {
        XmlElement xe=(XmlElement)xnf;
        Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
        Console.WriteLine(xe.GetAttribute("ISBN"));

     

        XmlNodeList xnf1=xe.ChildNodes;
        foreach(XmlNode xn2 in xnf1)
        {
         Console.WriteLine(xn2.InnerText);//显示子节点点文本
        }
       }

     

     

    C#编写XML读写类操作xml文件

    下面的例子是用C# 在asp.net 中实现对xml的操作,环境是vs2005 , 自己写了一个操作类,然后在使用的时候调用它。

    实现:登录用户信息的添加、修改和删除,不使用数据库,只在本地存放一个xml文件。

    时间:2007年12月21日

    下面是User.xml文件的格式,放在网站跟目录中,本例只为实现操作xml的功能,所以登录密码没有加密,在实际应用中,你应该考虑这个问题。同时,这个文件应该赋予写入的权限,这点比较容易疏漏。

    <?xml version="1.0"?>
    <UserLogin>
      
    <User>
        
    <UserCode>001</UserCode>
        
    <UserName>操作员1</UserName>
        
    <UserPwd>111</UserPwd>
      
    </User>
      
    <User>
        
    <UserCode>002</UserCode>
        
    <UserName>操作员2</UserName>
        
    <UserPwd>222</UserPwd>
      
    </User>
    </UserLogin>

    下面我们开始编码,首先vs2005中创建asp.net 网站,选择c#语言

    新建一个web窗体,放上三个textbox,三个button,暂时不用改名字,为了方便大家(以及我懒)这个例子中没有改控件的名字(脸红)。

     接着新建项目--类,取名为XmlRW.cs,存放到app_Code文件夹中

    在最上部加上对xml的using  : using System.Xml  如下面的代码

    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;

    /// <summary>
    /// Xml文件的读写类
    /// </summary>
    /// 

    public class XmlRW
    {
        
    public XmlRW()
        
    ...

    ////  大家注意 我们下面的内容在这里写

    }

    然后,我们开始写三个方法,来完成对xml文件记录的增加,修改和删除,也就是对UserCode,UserName,NamePwd的操作。代码如下:

    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;

    /// <summary>
    /// Xml文件的读写类
    /// </summary>
    /// 

    public class XmlRW
    {
        
    public XmlRW()
        
    {
            
    //
            
    // TODO: 在此处添加构造函数逻辑
            
    //
        }

        
        
    //WriteXml 完成对User的添加操作 
        
    //FileName 当前xml文件的存放位置
        
    //UserCode 欲添加用户的编码
        
    //UserName 欲添加用户的姓名
        
    //UserPassword 欲添加用户的密码

        
    public void WriteXML(string FileName,string UserCode,string UserName,string UserPassword)
        
    ...

        
    //DeleteNode 完成对User的添加操作 
        
    //FileName 当前xml文件的存放位置
        
    //UserCode 欲添加用户的编码

        
    public void DeleteNode(string FileName, string UserCode)
        
    {
            
    //初始化XML文档操作类
            XmlDocument myDoc = new XmlDocument();
            
    //加载XML文件
            myDoc.Load(FileName);

            
    //搜索指定某列,一般是主键列
            XmlNodeList myNode = myDoc.SelectNodes("//UserCode");

            
    //判断是否有这个节点

            
    if (!(myNode == null))
            

                
    //遍历节点,找到符合条件的元素

                
    foreach (XmlNode  xn in myNode)
                
    {
                    
    if (xn.InnerXml  == UserCode)
                        
    //删除元素的父节点
                        xn.ParentNode.ParentNode.RemoveChild(xn.ParentNode);
                }

            }


            
    //保存
            myDoc.Save(FileName);

        }


        
    //WriteXml 完成对User的修改密码操作
        
    //FileName 当前xml文件的存放位置
        
    //UserCode 欲操作用户的编码
        
    //UserPassword 欲修改用户的密码

        
    public void UpdateXML(string FileName, string UserCode, string UserPassword)
        
    {

            
    //初始化XML文档操作类
            XmlDocument myDoc = new XmlDocument();
            
    //加载XML文件
            myDoc.Load(FileName);

            
    //搜索指定的节点
            System.Xml.XmlNodeList nodes = myDoc.SelectNodes("//User");

            
    if (nodes != null)
            
    {
                
    foreach (System.Xml.XmlNode xn in nodes)
                
    {
                    
    if (xn.SelectSingleNode("UserCode").InnerText == UserCode)
                    
    {
                        xn.SelectSingleNode(
    "UserPwd").InnerText = UserPassword;
                    }


                }

            }


            myDoc.Save(FileName);

        }


    }

    Ok!这样操作xml的类我们就基本搞定了,下面回到一开始我们创建的那个页面上,为三个button加入它们相应的代码,即可超级轻松的实现对登录用户的操作,吼吼~

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    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;

    public partial class XmlTest1 : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {

        }


        
    protected void Button1_Click(object sender, EventArgs e)
        
    {

            
    //添加引用,创建实例
            XmlRW myXml = new XmlRW();
            
    //调用我们实现定义好的方法,对应传入各个参数
            myXml.WriteXML(Server.MapPath("YtConfig.xml"), TextBox1.Text, TextBox2.Text, TextBox3.Text);

            Response.Write(
    "Save OK!");

        }

        
    protected void Button2_Click(object sender, EventArgs e)
        
    {
            XmlRW myXml 
    = new XmlRW();
            myXml.DeleteNode(Server.MapPath(
    "YtConfig.xml"), TextBox1.Text );

            Response.Write(
    "Delete OK!");

        }

        
    protected void Button3_Click(object sender, EventArgs e)
        
    {
            XmlRW myXml 
    = new XmlRW();
            myXml.UpdateXML(Server.MapPath(
    "YtConfig.xml"), TextBox1.Text, TextBox3.Text );

            Response.Write(
    "Update OK!");

        }

    }

    运行测试,在textbox1中输入用户编码,在textbox2中填入用户名称,在textbox3中填入登录密码,点击button1完成添加....注意xml要事先先建好才行,其它略同.

  • 相关阅读:
    Redis学习笔记
    Sevrlet 工作原理解析-转
    Spring MVC基础学习
    JVMGC机制
    MyBatis基础学习笔记--摘录
    MyBatis基础学习笔记--自总结
    Spring基础复习
    java.lang.Class类
    浅谈linux静态库、动态库。
    关于字符编码的一点学习。
  • 原文地址:https://www.cnblogs.com/jonson1126/p/3178583.html
Copyright © 2020-2023  润新知