我有一个很大的XML文件,该文件我需要转换成另一种XML文件,我想这样做与XSLT。我更感兴趣的优化用于存储,而不是优化速度(虽然速度将是很好的也是!)。

它基于Java XSLT processor你会recommmend为这项任务?

你会推荐任何其他方法(非XSLT?, 非Java?), 如果是,为什么?

在XML文件的问题是非常大的,但不是很深数以百万计的行(元件),但只有大约3级别的深度。

有帮助吗?

解决方案

目前只有三个 XSLT2.0 处理已知的 并从他们 撒克逊9.x 可能是最有效的(至少根据我的经验)在速度和存储利用。 萨克森-SA (该模式的了解版本的撒克逊人,并不免费,因为B(基本)版本)具有特殊的扩展流行处理。

从现有的各种 XSLT1.0 处理器.净 XslCompiledTransform (C#-根据,不Java!) 似乎是冠军。

在Java为基础的世界的XSLT1.0处理器 撒克逊6.x 又是漂亮的好。

更新:

现在,超过3年,从该日期这一问题最初是回答说,没有任何证据表明,效率之间的差异的XSLT提到的处理器已经改变。

如流:

  1. XML文件"数以百万计的节点"很可能是处理,即使没有任何流.我进行了一项实验中,Saxom9.1.07处理XML文件,包含大约一百万3-rd级别的元素与整数值。转变简单地计算它们的总和。总时间的变换我的电脑上小于1.5秒钟。所使用的存储器是500兆-这电脑有可能甚至10年前,

这是撒克逊人的信息,显示信息有关的转变:

Saxon 9.1.0.7J from Saxonica
Java version 1.6.0_17
Stylesheet compilation time: 190 milliseconds
Processing file:/C:\temp\delete\MRowst.xml
Building tree for file:/C:\temp\delete\MRowst.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 1053 milliseconds
Tree size: 3075004 nodes, 1800000 characters, 0 attributes
Loading net.sf.saxon.event.MessageEmitter
Execution time: 1448 milliseconds
Memory used: 506661648
NamePool contents: 14 entries in 14 chains. 6 prefixes, 6 URIs
  1. 撒克逊9.4有 一个 撒克逊:流()扩大功能 可用于处理巨大的XML文件。

这里是一个摘录的文件:

基本上有两种方法的做流在撒克逊:

突发的模流:这种方法,改造 大文件被分成了一个序列的转变小 碎片的文件。每一片又是从输入,转身 进一个小树存、转化,并将其写入输出 文件。

这种方法很有效的文件相当平的结构, 例如一个录文件保持数以百万计的日志记录,那里的 处理的每个日志记录是独立的那个去 之前。

一个变这种技术的使用new XSLT3.0xsl:迭代 指令迭代的记录,在地方xsl:为每个。这使得工作的数据可以保持记录 处理:这使得它可能的,例如,输出总额或 平均在运行结束时,或者使该处理的一个 记录的依赖什么来之前它在该文件。Xsl:迭代 指令还允许早退出的循环中,这使得它 可能转变到数据的过程从开始 大的文件没有实际阅读整个文件。

突发的模流提供XSLT和属,但是有 没有相当于在属于xsl:迭代结构。

流模板:这种做法遵循传统XSLT 处理模式的执行递归下降输入XML 层级的模板匹配规则,以节点在每个级别,但是 这样做的一个元素在一段时间,没有建树,在存储器。

每一个模板属于一个模式(可能是默认的、无名的模式), 和流产的模式,可以指定的使用 新xsl:模式的宣言》。如果该模式是宣布 可流传送,那么每个模板的规则内的这一模式必须服从 规则对于可流传送处理。

该规则对于什么是允许在流处理是相当 复杂的,但基本原则是,该模板的规则 给定的一个节点可以只读取的后代,节点一次, 顺序。有另外的规则所施加的限制在目前的 撒克逊的执行情况:例如,虽然分组使用 理论上是一致的 与一流实施,它目前不实施 撒克逊人。

  1. XSLT3.0 会有标准的 流功能.然而,W3C的文件仍然是一个"工作草案"状态和流规范是有可能的变化在以后的草案版本。由于这个原因,没有实现的目前的草案(流)规范的存在。

  2. 警告:不是每个转型可以执行在流模式--无论XSLT processor.一个例子中的一个转变,这是不可能的执行在一个流模式(有限数量的RAM)对于庞大的文件是排他们的元素(说通过一个共同属性)。

其他提示

您可以考虑 STX ,其Java实现的 Joost的。因为它类似于XSLT,但作为一个数据流处理器是能够使用非常小的RAM来处理巨大的文件。

Joost的能够被用作标准javax.xml.transform.TransformerFactory中

请参阅用于流模式撒克逊支持。 http://www.saxonica.com/html/documentation/sourcedocs/streaming/

如果这种流模式是不适合你,你可以尝试使用撒克逊的微小的树模式,这是对于较小的内存使用情况进行优化。 (这是默认反正)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top