热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高效交换XML文档

XML文档由于其固有的描写性特征而趋向于变得很罗嗦。其成果是文档会由于被描写的数据增多而变得很长,而这种很大的文档会在需要同其他实体进行交换时呈现标题。和其他文档(比

XML文档由于其固有的描写性特征而趋向于变得很罗嗦。其成果是文档会由于被描写的数据增多而变得很长,而这种很大的文档会在需要同其他实体进行交换时呈现标题。和其他文档(比如普通文本文件(flat file)或者Electronic Data Interchange (EDI))比起来XML文档就显得特别冗长。为了举例阐明这个概念,让我们看看以下这个普通文本文件: John,Doe,1587,4/18/2000,1234

Anywhere St.,SomeCity,AZ,85222

再看这个XML文档:

以下为引用的内容:

John
Doe
4/18/2000

1234 Anywhere St.

SomeCity
AZ
85222

假如你曾处理过很多XML文档,那么你就不会希奇于即使这个XML文档和这个以逗号分隔开的普通文本文件中包含了雷同的原始数据(raw data),XML文档也显得比普通文本文件大很多了。毕竟,XML是一种元数据语言(metadata language)(它包含了很多长处比如支撑解析、验证、转换等等),因此决定了其大小会比另一些同类文档格局大很多。由于XML被更广泛地作为一种数据交换的方法来应用,那么被交换的文档的大小会下降利用程序的性能和可升级性就是毫无疑问的了。

有很多方法来使XML文档的大小最小化,比如(在适当的处所)将元素转换为属性,缩写元素和属性名,往掉不重要的空缺处,只定义一些内容。然而无论你做出何种转变,终极大批的原始数据还是会形成一个很大的XML文档。假如你的XML文档中包含有很多兆字节,你又该如何在你的企业中对它们进行有效地传递或将它们传递到其他企业中往呢?

一种方法是将一个大的XML文档分成多个文档,它们会(假如可以切分的话)运行的很好,但这样还会产生一些额外的复杂性和确保所有文档都能被准确发送和接收的标题。即使是被离开的小文档也可能会由于大批被传递的数据而形成几兆字节大小的文档。既然存在这些埋伏的标题,那我们这些XML开发职员该如何更有效地对XML数据进行交换呢?(我同意往打高尔夫。)

你可以用压缩技巧来加速各点之间的文档交换。由于XML是一个简略的文本情势,因此大的文档可以被压缩成较小情势。这里显示的典范程序证实了如何通过将一个开发式代码的.Net组件添加到一个ZIP存档文件中来实现用程序来压缩XML文档。这么做能够将文件的大小减至最小并提高数据交换的效率。

尽管.Net的J#语言本身支撑压缩,但构建到.Net框架中的基类库却不支撑。然而,有一个完整由管制代码写成的名为SharpZipLib的组件可以被用于压缩各种类型的文档(在www.icsharpcode.net/OpenSource/SharpZipLib/default.asp中下载该组件)。SharpZipLib是一个用C#写的、用在.Net中支撑Zip、GZip、Tar和BZip2的类库。它是作为一个assembly来实现的,而且它还能够同任何应用.Net语言的项目联合应用。

我曾在几个利用程序中应用过SharpLibZip的早期beta发行版,我认为它在对文档进行压缩和解压缩方面非常有效。让我们来看看如何应用SharpZipLib组件来实现用程序压缩XML文档。

压缩XML文档

尽管SharpZipLib能够履行好几种类型的压缩,但我还是决定在典范程序中应用利用最为广泛的ZIP压缩格局,由于它很著名,也很好用。为了使代码能够被重用,我写了一个名为Zipper的自定义类。Zipper中有一个名为GenerateZipFile()的静态方法(它可以接收指定要保留ZIP文件的路径)以及一个包含所有要压缩的文件路径聚集的ArrayList(见列表1)。

Zipper类是SharpZipLib中名为ZipOutputStream类的一个封装类。你几乎不用写什么代码,也不用花什么力量就可以用Zipper来将多个文件压缩到一个简略的ZIP存档文件中(一个带有ZIP扩大名的文件)。这个GenerateZipFile()方法是通过建立一个ZipOutputStream类的实例并通过其SetLevel属性设置压缩级别来实现压缩的。最高压缩级别可以被设置到9,而最低则为0。

设置好压缩级别之后,由ArrayList(被传进GenerateZipFile())方法)所指定的文件内容就会被处理。一个天生的计数器(enumerator)会逐个列举该列表中的文件。每个文件被加载到一个接收文件名和登录时间的ZipEntry对象中。然后ZipEntry对象通过PutNextEntry()方法被添加到ZipOutputStream对象中。

在文件名被添加到这个ZIP存档文件之后将通过一个FileStream对象来读取其内容。FileStream(位于System.IO命名空间下)用于将文件以字节情势读进到缓冲区中。你可以通过调用FileStream对象中的Read()方法来完成读取把持。在缓冲区中的字节通过Write()方法被写进ZipOutputStream对象中。留心Write()方法接收要写进数据流中字节的长度以及在缓冲区中的起始地位。该过程实用于所有包含在传给GenerateZipFile()方法的ArrayList参数之中的每一个文件。 当所有条目被添加到这个ZIP文件之后,它会以一个ZIP作为文件扩大名被保留到硬盘中。

列表2中显示了一个用于测试Zipper类的简略ASP.Net利用程序的代码(见图1)。它是从定义一个要被压缩的XML文档路径和存储ZIP文件的路径开端的。尽管在这个例子中只有一个被压缩的XML文档,但是其他文档的路径可以被添加到ArrayList对象中来进行压缩。在所有文件路径被定义好之后,将会调用静态方法GenerateZipFile()。一旦这个ZIP文件被建好之后,会通过System.Web.Mail命名空间下的类来给终极用户发送一封e-mail。

解压XML文档

对XML文档进行压缩的才能在不同的情况下是非常有用的,但不可避免地会呈现这种情况:有人给你发送了一个在解析前需要被展开的(extracted)的压缩文档。这个标题可以直接通过应用SharpZipLib中的一个名为ZipFile的类来解决。在列表3中你可以看到在这个用于将压缩文件展开到一个指定目录下的Zipper类中有一个名为ExtractZipFile()的静态方法。代码首先通过将一个FileStream对象(通过调用File.Open()方法得到的)传进ZipFile类的结构器中来建立一个ZipFile实例。建立好对象之后,ZIP文件中的每个ZipEntry会被列举(enumerate)出来。然后调用ZipFile对象的GetInputStream()方法,该方法接收一个要被展开的ZipEntry作为参数。从GetInputStream()返回的数据流被读取到一个缓冲区中,该缓冲区通过一个FileStream被写进到文件里。在调用GetInputStream()时,该ZipFile类会主动对ZipEntry进行解压。

在调用ExtractZipFile()方法之后,所有位于ZIP文件中的被压缩文件会被展开并存储到硬盘上。另外,解压的字节流会被写进一个MemoryStream对象中,这在文件被解析前无需被保留到硬盘上时非常有用。

尽管XML是一个很冗长的元数据语言,但大的文档可以在应用.Net组件(比如SharpLibZip)后被压缩成一个很小的文档。通过对这些文档进行压缩,可以缩短不同实体间文档交换的时间,其成果是能够更快地处理数据。想要试试这个很好的压缩/解压代码的例子,你可以拜访www.xmlforasp.net/codeSection.aspx?csID=95。

关于作者:
Dan Wahlin(是ASP.NET方面的Microsoft MVP)是Wahlin Consulting LLC公司的总裁并创办了XML for ASP.NET Developers网站(www.XMLforASP.NET),其中重要研究如何在Microsoft的.Net平台下应用XML和Web services。他还是一名合作培训师和演讲者,并在美国各地教授“public and on-site XML and .Net”培训课程。Dan是Professional Windows DNA (Wrox)、ASP.NET Tips、Tutorials 和Code (Sams)等书的合著者,并著有XML for ASP.NET Developers (Sams)一书。他的接洽方法是dwahlin@xmlforasp.net。

推荐阅读
  • 通过自定义 `TextView`,实现了在用户点击或焦点变化时动态调整字体颜色的效果。该方法利用了 `ColorStateList` 和 `Selector` 资源文件,确保了界面交互的流畅性和视觉效果的提升。具体实现中,通过重写 `onTouchEvent` 和 `onFocusChanged` 方法,精确控制了颜色变化的时机和状态。此外,还对性能进行了优化,确保在高频率操作下依然保持高效响应。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • 深入解读代码页与字符集的概念及其实际应用
    许多开发者可能未曾留意到这一问题,但如果您的网站频繁遭遇不明原因的乱码现象,深入了解代码页与字符集的概念及其实际应用将大有裨益。代码页(Codepage),即内码表,是计算机系统中用于映射字符与其编码值的一种机制,不同的代码页支持不同的字符集,正确选择和配置代码页对于确保文本数据的准确显示至关重要。在多语言环境下,合理运用字符集和代码页能够有效避免字符编码冲突,提升用户体验。 ... [详细]
  • 尽管许多人认为跑步是一项简单的运动,但实际上它涉及诸多专业知识。不正确的跑步方式不仅会降低锻炼效果,还可能引发伤害。例如,穿着不合脚或过于陈旧的跑鞋,会导致足部支撑不足,增加受伤风险。此外,跑步姿势不当、热身不足、过度训练等问题也同样值得关注。本文将详细介绍七大常见跑步误区,并提供专业的改进建议,帮助跑者避免这些问题,提高运动效率和安全性。 ... [详细]
  • 在第六章中,我们将深入探讨MySQL中的多表查询技术,包括联结查询和子查询。联结查询通过将两个或多个表进行连接,基于连接条件生成结果集。常见的联结类型有内联结、外联结和全外联结。交叉联结(CROSS JOIN)虽然使用较少,但其原理是生成所有可能的组合,类似于笛卡尔积的概念。此外,子查询则是在一个查询语句中嵌套另一个查询,用于获取更复杂的数据集。本章将通过实例详细讲解这些查询方法的应用和优化技巧。 ... [详细]
  • 新年伊始,正是学习的最佳时机。本文全面解析了CK1957-Zookeeper的核心概念与实践技巧,旨在帮助初学者快速掌握这一深度学习工具。通过详细的理论讲解和实际操作示例,读者可以更好地理解Zookeeper的工作原理及其在分布式系统中的应用。无论是新手还是有一定基础的学习者,都能从中受益匪浅。 ... [详细]
  • 探究Oracle数据库字符集编码的详细方法与实践
    本文深入探讨了Oracle数据库字符集编码的详细方法与实践。首先,通过执行 `SELECT USERENV('language') FROM DUAL;` 查询服务端字符集编码。其次,通过在注册表中搜索 `NLS_LANG` 参数来查看客户端字符集编码。此外,文章还介绍了如何在不同场景下正确配置和转换字符集,以确保数据的一致性和完整性。 ... [详细]
  • 在执行 Vim/VM 命令时遇到错误提示:检测到名为
    在使用 Docker 时,通过 Vim 编辑 Dockerfile 文件时遇到了错误提示:“检测到名为 .dockerfile.swp 的交换文件”。这一问题通常是因为上次编辑该文件时意外中断,导致系统生成了临时的交换文件。为了解决这个问题,可以手动删除该交换文件或使用 Vim 的恢复功能来恢复未保存的更改。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 斐波那契数在组合数学中的应用与探索
    斐波那契数列作为数学领域中一个广为人知的数列,不仅拥有丰富的数学性质,还与自然界的诸多现象紧密相连。本文将深入探讨这一数列背后的奥秘,揭示其在组合数学中的广泛应用,并通过具体问题的引入,展示斐波那契数列在解决复杂组合问题时的独特优势。 ... [详细]
  • Jenkins学习精华:自动化构建与持续集成入门指南
    本文综合了网络资源及同事分享的PPT内容,详细介绍了Jenkins在自动化构建与持续集成中的应用。首先涵盖了Jenkins的安装与配置流程,接着阐述了如何根据项目需求设定自动化编译任务,包括确定开发环境、选择合适的编译工具以及实现代码的自动更新等关键步骤。特别强调了在SVN环境中通过命令行实现代码自动拉取的最佳实践。 ... [详细]
  • jQuery学习笔记:深入理解事件委派(2014年8月3日)
    在jQuery中,事件委托机制主要通过`closest()`方法实现。该方法用于查找与指定选择器匹配的最近祖先元素,从当前元素开始逐级向上遍历DOM树。这一技术不仅提高了代码的效率,还能有效处理动态生成的元素。参考资料:jQuery遍历方法详解。 ... [详细]
author-avatar
风行天下的石头_467
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有