在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小。

XmlDictionaryWriter类从XmlWriter类派生,它公开了一些静方法,可以直接创建基于文本、二进制和MTOM格式的XML写入对象。文本格式就不多说了,就是直接把XML内容写入文件,二进制和MTOM相似,都对文件内容进行压缩,说白了,是输出为纯字节形式。MTOM常用于读写SOAP消息。

我们可以做个例子来比较一下,看看以文本方式写入XML,以及以二进制方式写入XML,它们之间的差别有多大。

首先,定义一个枚举,用于决定是使用文本格式写入还是二进制格式写入。

    public enum WriteFormat
{
Text,
Binary
}

然后写一个SaveXmlToFile方法,第一个参数是要保存的XML文件的路径,第二个参数是刚刚定义的枚举,用于确定写入格式。

        public void SaveXmlToFile(string filepath,  WriteFormat fmt)
{
using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
{
// 创建Writer
XmlDictionaryWriter writer = null;
if (fmt == WriteFormat.Text)
writer = XmlDictionaryWriter.CreateTextWriter(fs);
else
writer = XmlDictionaryWriter.CreateBinaryWriter(fs); // 写入文档声明
writer.WriteStartDocument(); // 写入根节点
writer.WriteStartElement("宠物");
// 写入宠物子节点
writer.WriteStartElement("名字"); // <名字>
writer.WriteString("荷兰兔");
writer.WriteEndElement(); // </名字>
writer.WriteStartElement("年龄"); // <年龄>
writer.WriteString("");
writer.WriteEndElement(); // </年龄>
// 直接Flush
writer.Flush(); writer.Dispose();
}
}

直接调用XmlDictionaryWriter的CreateXXXWriter方法,就可以得到一个XmlDictionaryWriter实例,XXX就看你要用的格式了,有Text、Binary、Mtom三种。

当使用非文本格式写入XML时,会把XML中的文本内容存到一个叫XmlDictionary的对象来存放字符串映射,可以手动指定XmlDictionary对象,其中存放的每个字符串实例都可以用XmlDictionaryString实例来包装。

如果我们不指定XmlDictionary实例,则Writer会自动创建,并把XML文档中的所有字符串对象(命名空间、元素名、特性名,以及文本节点的内容等)都放到XmlDictionary中映射为二进制内容。

如果后面没有要写入的内容了,可以直接调用Flush方法,它不仅可以把缓冲的内容写入流中,而且会自动补全XML元素的结束标签。

现在分别以文本格式和二进制格式写入XML文件。doc1.xml文件是文本格式写入的,doc2.xml是用二进制格式写入的,对比结果如下。

相同的内容,用文本格式保存,需要99个字节,而使用二进制格式则需要36个字节。

用记事本打开用二进制格式保存的XML文档,会看到如下内容。

打开文本格式保存的文件,可以直接看到内容。

好了,今天的废话就讲到这里吧,开饭了。

【.net 深呼吸】使用二进制格式来压缩XML文档的更多相关文章

  1. 关于XML文档的讲解

    1        XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和HTML比较相似,但HTML中的元素是固定 ...

  2. XML文档结构

    <?xml version="1.0" encoding="UTF-8"?> <books> <bool id="bk1 ...

  3. Anakia 转换xml文档为其他格式

    一.简介 Anakia 使用JDOM 和Velocity将XML文档转换为特定格式的文档 二.解析xml文档方法 1.DOM java jdk,xml-api.jar 需要加载整个xml文档来构建层次 ...

  4. java将XML文档转换成json格式数据

    功能 将xml文档转换成json格式数据 说明 依赖包:1. jdom-2.0.2.jar : xml解析工具包;2. fastjson-1.1.36.jar : 阿里巴巴研发的高性能json工具包 ...

  5. (转载)将一段符合XML格式规范字符串插入已有XML文档当中

    想我们已经存在一个XML文档,结构如下:   < xmlversion="1.0"encoding="utf-8">< employees&g ...

  6. 编写Java程序,使用 dom4j 创建一个 XML 文档,文档名为“city.xml”。注意该文档的格式和数据

    查看本章节 查看作业目录 需求说明: 使用 dom4j 创建一个 XML 文档,文档名为"city.xml".该文档的格式和数据如图所示 实现思路: 创建Java项目,添加dom4 ...

  7. Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)

    本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...

  8. 【转】Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)

    [转]Python之xml文档及配置文件处理(ElementTree模块.ConfigParser模块) 本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 ...

  9. ElementTree之Xml文档处理

    ElementTree: 表示整个XML层级结构 Element: 表示树形结构中所有的父节点 SubElement: 表示树形结构中所有的子节点 有些节点既是父节点,又是子节点 下面来看下这两个类的 ...

随机推荐

  1. 完美判断iframe是否加载完成

    var iframe = document.createElement("iframe"); iframe.style.width = "265px"; ifr ...

  2. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...

  3. ExtJS 4.2 业务开发(三)数据添加和修改

    接上面的船舶管理业务,这里介绍添加和修改操作. 目录 1. 添加操作 2. 修改操作 3. 在线演示 1. 添加操作 1.1 创建AddShipWindow.js 在业务中的view目录下创建一个Ad ...

  4. RestTemplate发送请求并携带header信息

    1.使用restTemplate的postForObject方法 注:目前没有发现发送携带header信息的getForObject方法. HttpHeaders headers = new Http ...

  5. C#与C++通信

    # C#与C++相互发送消息 # ## C#端: ## namespace CshapMessage { /// /// MainWindow.xaml 的交互逻辑 /// public partia ...

  6. js闭包 和 prototype

    function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...

  7. 真正的汉化-PowerDesigner 16.5 汉化

    一.背景 经常使用PowerDesigner,之前使用15版本,后来16出来后,就一直在使用16,不过一直是英文.一些同事对使用英文版总显示有些吃力. 遍寻百度.必应,都没有找到真正的针对版本16的汉 ...

  8. 初识npm

    一.npm简介: npm全称为Node Package Manager,是一个基于Node.js的包管理器,也是整个Node.js社区最流行.支持的第三方模块最多的包管理器. npm的初衷:JavaS ...

  9. CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用

    Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...

  10. C#中一些常用的加密和哈希处理

    URL编码,默认UTF8编码方式 /// <summary> /// URL编码,默认UTF8编码方式 /// </summary> /// <param name=&q ...