【.net 深呼吸】使用二进制格式来压缩XML文档
在相当多的情况下,咱们写入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("2"); 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文档,会看到如下内容。
打开文本格式保存的文件,可以直接看到内容。
好了,今天的废话就讲到这里吧,开饭了。