0

我正在使用 java 6 并处理一些非常大的 xml 文档......我需要解析它们并修改一些值,然后序列化回磁盘。

我使用org.w3c.DOM反序列化xml文档并修改了一些属性值,我使用JAXP Transformer序列化了已更改的dom文档。但是我发现它真的很慢......

所以我想知道是否有更有效的方法来序列化 dom 文档或处理大型 xml 文档?

更新:

我使用了一个计时器来记录每个部分需要多长时间,下面是序列化:

// serialize the updated DOM
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();

long t0 = timer.currentTimeMillis();
DOMSource source = new DOMSource(dom);
StreamResult result = new StreamResult(doc);
transformer.transform(source, result);
long t1 = timer.currentTimeMillis();

Reporter.log("Finished serializing " + doc.getAbsolutePath() + " in " + (((t1 - t0)) / 1000.0f) + " s.", true);

日志显示:

....
Finished serializing C:\Usrs\Adminstrator\Documents\Docs\InitialDocument_1.xml in 53 s.
4

4 回答 4

3

您应该考虑使用 StAX。DOM 不适合这里。你可以在这里看到比较。

http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html

您可以参考以下 URL 获取示例代码。

http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html

于 2013-05-06T19:17:10.567 回答
2

您是否尝试过使用 SAX 接口?

如果您需要真正快速处理非常大的 xml 文档,则必须避开 DOM 结构。看看这样的非dom解析器:

http://vtd-xml.sourceforge.net/

于 2013-05-06T19:17:48.253 回答
1

最快的方法是 StAX。最简单的方法是 JAXB。

于 2013-05-06T19:17:32.393 回答
0

50 秒序列化 90Kb 太疯狂了。DOM 很慢,但没那么慢;出了点问题,我不知道是什么。

然而,将 90Kb 描述为“大”是一种严重的误导,这种错误描述可能影响了一些答案。

你需要多快?我的猜测是标准的转换机制,比如 XSLT 已经足够快了。

另一个相关因素是,您需要对内容进行哪些更改?很大程度上取决于所需逻辑的复杂性。

于 2013-05-06T22:27:28.223 回答