专业的编程技术博客社区

网站首页 > 博客文章 正文

使用二进制格式来压缩XML文档

baijin 2025-03-10 12:13:35 博客文章 78 ℃ 0 评论

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

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

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表