我们正在使用XSLT生成数据报告。数据当前作为XML文档存储在Oracle中(不使用XMLTYPE,而是使用普通CLOB)。我们选择正确的XML文档并创建一个文档:
<DATABASE>
<XMLDOCUMENT> ... </XMLDOCUMENT>
<XMLDOCUMENT> ... </XMLDOCUMENT>
...
</DATABASE>
在某些情况下,完整的XML文档包含+100000个文档。这意味着一个巨大的XML文档首先被加载到内存中,导致各种内存问题。
我们如何防止这种情况发生?我们在.NET 2.0中使用XslCompiledTransform
类。
我知道解析XML文档有两种形式:DOM和SAX。但据我了解,SAX方式不可能与XSLT结合使用。 DOM解析方法强制我们将整个内容加载到内存中。
我们有什么选择?首先将完整的文档写入磁盘有帮助吗? Oracle是否在大型XSLT转换方面做得更好?
答案 0 :(得分:4)
根据您想要进行的转换类型,STX可能是XSLT的替代方法:
XML的流式转换 (STX)是一次转换 XML文档的语言。 STX是 打算作为高速,低内存 消费替代XSLT,使用 W3C XQuery 1.0和XPath 2.0数据 模型。由于STX不需要 它构建了一个内存中的树 适用于资源 约束情景。
答案 1 :(得分:1)
有一个名为VTD-XML的第三个XML处理模型可以克服DOM的大部分内存问题,本机支持你应该看的XPath ...... XSLT对它的支持正在进行中......
答案 2 :(得分:1)
答案 3 :(得分:0)
据我所知,CLOB可以流式传输。当然,将流式传输到本地文件系统是其中一个选项。但是,随着大多数XSLT引擎在DOM上执行操作,您将遇到同样的问题。我建议将文件拆分为较小的块(在您的情况下为XMLDCOUMENT)。这可以在没有XSLT的情况下完成,但只需要一些简单的正则表达式。然后在每个块上运行XSLT转换。当然,这比在内存中完成所有操作要慢,但如果文档太大,这将使您免于内存问题。