Java 创建对读取操作线程安全的DOM

Java 创建对读取操作线程安全的DOM,java,thread-safety,xerces,Java,Thread Safety,Xerces,我的应用程序由许多xml源组成一个网页模型。使用普通Xerces解析器将这些源作为DOM对象解析到内存中。不幸的是,Xerces DOM对象对于只读操作不是线程安全的。我希望能够重用解析后的DOM进行读取。有人知道我使用的另一个解析器或简单的线程安全的读取DOM实现吗?我不知道任何完美而简单的解决方案 一个想法可能是使用线程安全对象重新创建Dom 在这种情况下,它们最好是不可变的,因为您只阅读。 不可变也为进一步的改进提供了可能性(例如,实例共享将导致更小的内存占用) 我希望我能推荐一个这样做的

我的应用程序由许多xml源组成一个网页模型。使用普通Xerces解析器将这些源作为DOM对象解析到内存中。不幸的是,Xerces DOM对象对于只读操作不是线程安全的。我希望能够重用解析后的DOM进行读取。有人知道我使用的另一个解析器或简单的线程安全的读取DOM实现吗?

我不知道任何完美而简单的解决方案

一个想法可能是使用线程安全对象重新创建Dom

在这种情况下,它们最好是不可变的,因为您只阅读。 不可变也为进一步的改进提供了可能性(例如,实例共享将导致更小的内存占用)


我希望我能推荐一个这样做的库,因为这是相当多的编码…

Saxon为其内部和不可变的数据结构提供DOM包装

// create Saxon IdentityTransformer
final Transformer transformer = new TransformerFactoryImpl().newTransformer();

// set up holder for the output
final TinyBuilder outputTarget = new TinyBuilder(
    new PipelineConfiguration(new Configuration()));

// transform into Saxon's immutable TinyTree
transformer.transform(xml, outputTarget);

// extract the whole XML as TinyNode 
final TinyNodeImpl tinyNode = outputTarget.getTree().getNode(0);

// wrap TinyNode as DOM
final NodeOverNodeInfo nodeOverNodeInfo = DocumentOverNodeInfo.wrap(tinyNode);

// cast to DOM
final Document doc = (Document) nodeOverNodeInfo;
(使用萨克森he 9.5.1进行测试)