哪种读取xml更快?

时间:2011-12-14 07:44:21

标签: xml xslt sax

我正在使用XSLT读取300MB的XML文件 - 我需要检查一些标签内容,并根据我必须打印其他标签元素作为输出。

这需要很长时间(10分钟),最后它会终止声明“已杀死”并且没有其他输出。

还有什么更快的方法?我可以在java中使用SAX解析器读取它吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

第一步是确定在XML解析器或XSLT处理器中花费的时间:尝试(a)不执行任何操作的转换(<xsl:template match="/"/>),以及(b)复制所有内容的转换( <xsl:template match="/"><xsl:copy-of select="."/></xsl:template>)并将结果与​​实际转化进行比较。

XSLT处理器确实变化很大,如果可能的话,你应该试试几个。您可能还需要尝试使用XSLT处理器的不同方法,例如,某些方法具有内部树模型,这可能比使用DOM更有效。所以回过头来看看处理器的详细信息以及如何使用它。

最后,“很长一段时间”没有告诉我们什么。告诉我们它实际需要多长时间,我们可以告诉你这是否合理,或某些地方是否出现严重错误。

答案 1 :(得分:1)

XSLT样式表可以像正则表达式一样转换为状态机(一些用于处理XSLT的库具有“编译”选项,允许用户决定执行此操作的成本与使用这样做了。)

当这样做时,它可以非常快。样式表的性质会影响这一点。如果模板匹配是这样的,它可以全部以只向前的方式完成(或者可以在内部重新编写成可以),它会比某些东西要求它在文档中重新执行许多步骤要快得多

即使是最好的实现也可能比使用XML的正向解析的最佳实现要慢(无论是像SAX还是pull一样推送)。但是,与XSLT方法一样,如果仅向前解析器必须保持关于先前遇到的元素的大量状态,以便它可以以引用那些先前元素的方式响应某些元素,这可能会减慢速度相当。最终,你会发现DOM方法(无论是完整文档,还是其子树)在速度上变得可比,而且可能更简单(因为引用以前遇到的元素正是DOM最容易实现的)。

因此,无论采用哪种方法,如果您能够看到重写文档中“向上”或“向后”的部分以便减少这些操作的方法,您将获得更大的收益。

相关问题