开发者社区> 科技小先锋> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

XML类及XmlSerializer 的使用

简介:
+关注继续查看

序列化成xml则相较序列化成二进制受到很多限制,主要有三个.


1是只能序列化public的字段或属性.


2是有些类型是不能序列化.比如上面的HastableTimeSpan这样的类型.


3是类中必须有无参的构造函数才能被序列化成xml.


下面是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文件夹中


在最上部加上对xmlusing  : 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()

   {

      //

      // TODO: 在此处添加构造函数逻辑

      //

   }


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


}


然后,我们开始写三个方法,来完成对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,stringUserName,string UserPassword)

   {


      //初始化XML文档操作类

      XmlDocument myDoc = new XmlDocument();

      //加载XML文件

      myDoc.Load(FileName);


      //添加元素--UserCode

      XmlElement ele = myDoc.CreateElement("UserCode");

      XmlText text = myDoc.CreateTextNode(UserCode);


      //添加元素--UserName

      XmlElement ele1 = myDoc.CreateElement("UserName");

      XmlText text1 = myDoc.CreateTextNode(UserName);


      //添加元素--UserPwd

      XmlElement ele2 = myDoc.CreateElement("UserPwd");

      XmlText text2 = myDoc.CreateTextNode(UserPassword);


      //添加节点 User要对应我们xml文件中的节点名字

      XmlNode newElem = myDoc.CreateNode("element","User", "");


      //在节点中添加元素

      newElem.AppendChild(ele);

      newElem.LastChild.AppendChild(text);

      newElem.AppendChild(ele1);

      newElem.LastChild.AppendChild(text1);

      newElem.AppendChild(ele2);

      newElem.LastChild.AppendChild(text2);


      //将节点添加到文档中

      XmlElement root = myDoc.DocumentElement;

      root.AppendChild(newElem);


      //保存

      myDoc.Save(FileName);


   }


  //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, stringUserPassword)

   {


      //初始化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



C# XmlSerializer实现序列化浅析


  C# XmlSerializer类是实现序列化的一个类,那么关于C# XmlSerializer的学习我们要掌握怎么样的操作方法呢?那么这里向你详细介绍具体的操作细节情况。


  C# XmlSerializer是什么呢?它是使用二进制格式化程序进行序列化的一个类,那么具体的通过C# XmlSerializer如何实现序列化操作呢?在序列化操作的过程中需要注意些什么呢?


  C# XmlSerializer的出处:


      using System.Xml.Serialization;


  C# XmlSerializer实现序列化:


      XmlSerializer xml = new XmlSerializer(typeof(Test));  

      FileStream fs = newFileStream(@"c:\t.xml",FileMode.Create);  

      xml.Serialize(fs, t);  

      fs.Close();


  C# XmlSerializer实现反序列化:


      FileStream fs = new FileStream(@"c:\t.xml", FileMode.Open);  

      XmlSerializer xml = new XmlSerializer(typeof(Test));  

      Test t = (Test)xml.Deserialize(fs);


  C# XmlSerializer类与主流的序列化类的几个不同点是:


   1、不需要Serializable属性,SerializableNonSerializable属性将会被忽略,但是使用XmlIgnore属性,和NonSerializable属性类似。


   2、该类不能安全地访问私有变成员,所以学要将私有成员改为公共成员,或者提供合适的公共特性。


   3、要求被序列化的类要有一个默认的构造器。


  C# XmlSerializer的使用基本情况就向你介绍到这里,希望对你了解和学习C# XmlSerializer类有所帮助,并且对序列化的操作有所认识。


本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1254060,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SHELL中使用sed替换文本
SHELL中使用sed替换文本
30 0
使用shell脚本快速得到主备关系
对于备库的使用,尤其是一主多备的环境,一直以来有一点感觉不大给力,那就是主备库的关系,总是感觉会少一点什么。 尤其是在做月度404审计的时候,总是要反复确认备库的IP。
892 0
java xml Serialize DeSerialize
原理 在反序列化的时候同样用到了树。工作原理见下。 1.最首先的结点对应着树的根节点; 2.往后每遇到一个标签,就申请一个结点作为当前节点的孩子节点; 3.若遇到的是正文,就把内容保存在当前节点的数据域中; 4.若遇到闭合标签,操纵树的指针指向回退到当前结点的父节点。 5.若xml数据合法,最终指针退回到根节点,数据就保存在树中。 至此一棵树就构造完了,有名字有内容,再把用这
1154 0
sizeof的使用
 通过sizefo可以求出数据类型使用的字节数。 语法:1、sizeof(数据类型变量名称);  2、sizeof(数据类型); #include&lt;stdio.h&gt; void main() {    //字符类型    char charType ='c';    //可以通过siezeof数据类型的方式得到此
953 0
6963
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载