金色坐标

关注互联网和IT科技的个人博客

« CNNIC发布中国搜索引擎市场广告主与用户行为研究报告信息系统用户集合并办法 »

利用XML进行文件传输的.NET实现方法

XML(Extensible Markup Language)可扩展标识语言,可以按照自己实际需求,设计定义标识,通过XML能够方便的定义,制作和管理文件,同时还能方便的在网络上传输数据和共享文件。

如今,但凡涉及不同系统间的数据传输,XML则是个优先考虑的解决方案,因为.NET框架提供了System.XML.Serialization.XMLSerializer类型,能够将XML反序列化为对象,对象序列化为XML,为处理XML提供了强大的支持。

那么如何在.NET平台中实现利用XML进行文件传输呢,其步骤如下:

第一步:新建XML架构项。

项目点击右键,选择新建项,此时弹出VS.2008已安装的项模板。在添加的时候要注意,我们要添加的是XML架构,不要错添加为数据集。如下图所示:


 
 

红笔圈出来的分别是XML架构和数据集,两者的后缀都是XSD,所以新手容易混淆,其实两者是完全不同的概念。在这里我们要添加的是XML架构。。

第二步:根据实际需要,添加元素。


  
 

VS2005提供可视化编辑界面,现在VS2008则没有该图像操作界面了,直接代码编辑界面的。需要特别说明的是,在这里data和row两个元素的关系是1对多的关系,在设计的时候,通过代码编辑,添加<xs:element name="row" maxOccurs="unbounded" minOccurs="0">,这样就能表示上面所说的1对多的关系。

第三步:将XML架构生成类。

这一步很重要,将该XML架构生成为对象。这个过程要用到VS.NET自带的xsd工具。输入命令行:xsd.exe /c 1.xsd /out:

笔者是将该XML架构文件放在桌面的,所以直接就生成了1.cs文件到桌面。当然这个自定义工具还可以自己灵活定义各种参数。生成的cs部分如下:


 
 

第四步:实际应用,在对象和XML之间互相转化。

现在就可以实现从数据库取到数据,填充到对象中,然后转化为XML传输给对方,当然也可以读取对方提供的该架构的XML文件。主要是通过下面的方法进行转换的:

/// <summary>
/// 将对象序列化为字符串
/// </summary>
/// <param name="o">对象</param>
/// <param name="type">类名称</param>
/// <param name="encoding">编码格式</param>
/// <returns></returns>
public string XMLSerialize(object o, Type type, System.Text.Encoding encoding)
 {
  XMLSerializer XMLSerializer = new XMLSerializer(type);
  using (MemoryStream memoryStream = new MemoryStream())
   {
                  XMLTextWriter XMLWriter = new XMLTextWriter(memoryStream, encoding);
                  XMLSerializer.Serialize(XMLWriter, o);

                  string result = encoding.GetString(memoryStream.ToArray()).Trim();
                  XMLWriter.Close();
                  memoryStream.Close();
                  return result;
              }
        }

/// <summary>
/// 将xml字符串反序列化为类
/// </summary>
/// <param name="xml">xml字符</param>
/// <param name="type">类名称</param>
/// <returns></returns>
public object XMLDeserialize(string XML, Type type)
 {
  XMLSerializer XMLSerializer = new XMLSerializer(type);
  System.Text.Encoding encoding = null;
  try
  {
   string coding = (new Regex("<\\?XML[^\\?]*encoding=\"(?<encoding>[^\"]*)\"[^\\?]*\\?>")).Match(XML).Result("${encoding}");
   encoding = System.Text.Encoding.GetEncoding(coding);
  }  
  catch
  {
   //异常处理
  }
  if (encoding == null)
  {
   encoding = System.Text.ASCIIEncoding.ASCII;
  }

  using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(XML)))
  {
   object obj = XMLSerializer.Deserialize(memoryStream);
   memoryStream.Close();
   return obj;
  }
 }

 

 




原创文章,如转载请注明:转载自金色坐标 [ http://www.kingxy.com/ ]

本文链接地址:http://www.kingxy.com/archives/104.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 关注新浪微博:关注新浪微博
  • 关注腾讯微博:关注腾讯微博
  • 通过Google订阅本站
  • 通过鲜果订阅本站
  • 通过电子邮件订阅
  • 本站支持WAP访问

Search

Google

最新评论及回复

最近发表

金色坐标博客——京ICP备09009094号

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
KingXY Blog - This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.