Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是最有效的基于Java的流式XSLT处理器?_Java_Xslt_Processor - Fatal编程技术网

什么是最有效的基于Java的流式XSLT处理器?

什么是最有效的基于Java的流式XSLT处理器?,java,xslt,processor,Java,Xslt,Processor,我有一个非常大的XML文件,需要将其转换为另一个XML文件,我想用XSLT来实现这一点。我更感兴趣的是对记忆的优化,而不是对速度的优化(尽管速度也不错!) 您会为此任务推荐哪个基于Java的XSLT处理器 您会推荐任何其他方法(非XSLT?、非Java?)吗?如果是,为什么 有问题的XML文件非常大,但不是很深——有数百万行(元素),但只有大约3层深 请参见流模式的Saxon支持 如果这种流模式不适合您,您可以尝试使用Saxon,它针对更小的内存使用进行了优化。(无论如何,默认值)可以考虑,ja

我有一个非常大的XML文件,需要将其转换为另一个XML文件,我想用XSLT来实现这一点。我更感兴趣的是对记忆的优化,而不是对速度的优化(尽管速度也不错!)

您会为此任务推荐哪个基于Java的XSLT处理器

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


有问题的XML文件非常大,但不是很深——有数百万行(元素),但只有大约3层深

请参见流模式的Saxon支持

如果这种流模式不适合您,您可以尝试使用Saxon,它针对更小的内存使用进行了优化。(无论如何,默认值)

可以考虑,java实现是什么。由于它类似于XSLT,但作为一个流处理器,它能够使用很少的RAM处理大量文件


Joost可以作为标准的javax.xml.transform.TransformerFactory使用

目前已知的处理器只有三个,从它们看来,无论在速度还是内存利用率方面,Joost都可能是最有效的(至少根据我的经验)(支持模式的Saxon版本,不像B(基本)版本那样免费)具有流式处理的特殊扩展

来自各种现有处理器,.NET(基于C,而不是Java!)似乎是冠军

在基于Java的XSLT 1.0处理器世界中同样非常好

更新

现在,从最初回答这个问题的日期算起已经三年多了,没有任何证据表明所提到的XSLT处理器之间的效率差异已经改变

至于流媒体

  • 即使不进行任何流式处理,也可以很好地处理具有“数百万节点”的XML文档。我进行了一个实验,在这个实验中,SASOM9.1.07处理了一个XML文档,该文档包含大约一百万个具有整数值的三级元素。转换只是计算它们的和。在我的计算机上进行转换的总时间不到1.5秒。使用的内存是500MB,这是PC在10年前就可以拥有的
  • 以下是Saxon的信息性消息,其中显示了有关转换的详细信息:

    来自Saxonica的Saxon 9.1.0.7J Java版本1.6.0_17 样式表编译时间:190毫秒 处理文件:/C:\temp\delete\MRowst.xml 使用类net.sf.saxon.tinytree.TinyBuilder为文件生成树:/C:\temp\delete\MRowst.xml 树构建时间为1053毫秒 树大小:3075004个节点,1800000个字符,0个属性 正在加载net.sf.saxon.event.MessageEmitter 执行时间:1448毫秒 使用内存:50661648 名称池内容:14个链中的14个条目。6个前缀,6个URI
  • Saxon 9.4有一个可用于处理巨大的XML文档
  • 以下是文档的摘录

    在Saxon中,基本上有两种进行流式处理的方法:

    突发模式流:使用这种方法,一个 大文件被分解为一系列小文件的转换 文件的碎片。依次从输入中读取每个工件,然后旋转 放入内存中的小树中,进行转换,并写入输出 文件

    这种方法适用于结构相当扁平的文件, 例如,包含数百万条日志记录的日志文件 每个日志记录的处理都独立于已执行的日志记录 以前

    此技术的一个变体使用新的XSLT 3.0 xsl:iterate 对记录进行迭代的指令,代替xsl:for-each。 这使得工作数据可以像记录一样进行维护 已处理:例如,这使输出总计或 在运行结束时求平均值,或进行一次处理 记录取决于文件中它之前的内容。xsl:iterate 指令还允许提前退出循环,这使得 可能进行转换以处理从一开始的数据 大文件,而不实际读取整个文件

    在XSLT和XQuery中都可以使用突发模式流,但是没有 XQuery中没有与xsl:iterate构造等价的元素

    流式模板:这种方法遵循传统的XSLT 执行输入XML递归下降的处理模式 通过将模板规则与每个级别的节点相匹配来实现层次结构,但是 一次只执行一个元素,而不在内存中构建树

    每个模板都属于一种模式(可能是默认的未命名模式), 流是模式的一个属性,可以使用 新的xsl:mode声明。如果模式被声明为 streamable,则该模式中的每个模板规则都必须遵守 可流化处理的规则

    流式处理中允许的规则非常复杂 复杂,但基本原则是 给定节点只能读取该节点的子节点一次,以 秩序。现行法律中的限制规定了更多的规则 Saxon实现:例如,尽管使用 理论上是一致的 对于流式实现,它当前未在中实现 撒克逊人

  • 将具有标准的。然而,W3C文档仍处于“工作草案”状态,流媒体规范可能会在后续草案版本中更改。因此,不存在当前草案(流)规范的实现

  • 警告:不是每个转换都可以在流模式下执行——不管XSLT处理器如何。一个exa