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;
}
}





