在相当多的情况下,咱们写入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. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  2. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  3. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)

    初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处 ...

  4. 如何定位Oracle数据库被锁阻塞会话的根源

    首先再次明确下,数据库因为要同时保证数据的并发性和一致性,所以操作有锁等待是正常的. 只有那些长时间没有提交或回滚的事物,阻塞了其他业务正常操作,才是需要去定位处理的. 1.单实例环境 2.RAC环境 ...

  5. WebSocket - ( 一.概述 )

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  6. arcgis api for js入门开发系列五地图态势标绘(含源代码)

    上一篇实现了demo的地图查询功能,本篇新增地图态势标绘模块,截图如下: 本篇核心的在于调用API的Draw工具:https://developers.arcgis.com/javascript/3/ ...

  7. VS2015 Git 源码管理工具简单入门

    1.VS Git插件 1.1 环境 VS2015+GitLab 1.2 Git操作过程图解 1.3 常见名词解释 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger) 获取 ...

  8. mac好用的markdown编辑器

    在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...

  9. 【微信SEO】公众号也能做排名?

    [写于2016年8月] 最近,微信团队发出一则公告,开放公众号运营者一年内更改公众号名一次,这对不少名字起的奇葩名字(包括dkplus)的公众号来说是一件好事. 为什么说是好事呢?公众号名字直接关联到 ...

  10. H5嵌入原生开发小结----兼容安卓与ios的填坑之路

    一开始听说开发H5,以为就是做适配现代浏览器的移动网页,心想不用管IE了,欧也.到今天,发现当初too young too simple,兼容IE和兼容安卓与IOS,后者让你更抓狂.接下来数一下踩过的 ...