【.net 深呼吸】使用二进制格式来压缩XML文档

作者: 杭谨

更新时间:2022-03-26 13:13:27

4228 阅读

在相当多的情况下,咱们写入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文档,会看到如下内容。

 

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

 

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

 

版权声明:本文著作权归作者【杭谨 】所有,不代表本网站立场。

侵权请联系:root_email@163.com