通过网络解析大型XML文件

时间:2010-01-25 22:16:43

标签: java xml servlets network-programming

我在网站上做了一些快速搜索,似乎无法找到我想要的答案,所以说,通过网络传递大型xml文件的最佳做法是什么。我对此事的想法是在可管理的部分中通过网络流式传输块,但我正在寻找其他方法和最佳实践。我意识到大是一个相对术语所以我会让你选择一个被认为是大的任意值。

如果有任何混淆,问题是“跨网络发送大型xml文件的最佳做法是什么?”

修改

我看到很多压缩被讨论,任何可以使用的特定压缩算法以及解压缩所述文件?当我知道那里有校对算法时,我没有太多愿意自己动手​​。我也很欣赏到目前为止的回复。

5 个答案:

答案 0 :(得分:2)

根据它的大小,您可能需要先考虑压缩它。当然,这取决于发送相同数据的频率以及更改频率。

说实话,绝大多数时候,最简单的解决方案运行良好。我建议首先以最简单的方式传输它(可能是一次性传输),如果结果有问题,请继续对其进行分段,直到找到一个很少被中断的大小。

答案 1 :(得分:2)

压缩和缩小XML大小已经成为十多年来的一个问题,特别是在带宽和客户端计算能力都很稀缺的移动通信中。无线通信中使用的最终解决方案是WBXMLWAP Binary XML Spec),如果我对客户端和服务器端都有足够的控制,我更喜欢使用它。

此规范定义了如何将XML转换为二进制格式,这种格式不仅紧凑,而且易于解析。这与通用压缩方法(例如gzip)形成对比,通用压缩方法需要高计算能力和接收器侧的存储器来解压缩然后解析XML内容。此规范的唯一缺点是应该在两侧都存在应用程序令牌表,这是一个静态定义的代码表,用于保存特定于应用程序的XML内容中所有可能的标记和属性的二进制值。今天,这种格式广泛用于移动通信,用于在大多数应用程序中传输配置和数据,例如OTA配置和联系人/笔记/日历/电子邮件同步。

使用此格式传输大型XML内容时,可以使用类似于SyncML协议中提议的分块机制。您可以在“2.6。大对象处理”部分中找到设计文档here,描述此机制。作为简要介绍:

  

此功能提供了一种同步大小超过可在一条消息中传输的对象的方法(例如,最大消息大小 - 在MaxMsgSize中声明   element - 目标设备可以接收的)。这是通过将对象拆分为每个都适合一条消息并通过连续发送它们的块来实现的。第一个数据块与对象的整体大小一起发送,一个MoreData标记表示将发送更多的块。每个后续块都使用MoreData标记发送,除了最后一个标记。

答案 2 :(得分:1)

压缩是一种显而易见的方法。这个XML bugger会像没有明天一样缩小。

答案 3 :(得分:0)

如果您可以在服务器上保留本地副本和两个副本,则可以使用diffxml将要传输的内容减少到仅更改,然后使用bzip2差异。这将大大降低带宽需求,但会牺牲一些存储空间。

答案 4 :(得分:-1)

您是否正在使用适当的XML解析器阅读XML,或者您是否正在阅读特定布局的预期?

对于XML数据馈送,等待整个文件下载可能会浪费内存和处理时间。您可以编写一个自定义解析器,可能使用正则表达式搜索,如果您可以保证XML在标记内没有任何换行符,则可以逐行查看XML。

如果您的代码可以一次一个节点地消化XML,那么使用Transfer-Encoding:chunked之类的东西将其一次性地吐出一个节点。您可以编写块的长度(十六进制),然后是块,然后是另一个块,或者最后是“0 \ n”。为了节省带宽,请对每个块进行gzip。