5

私のアプリケーションは、多数の xml ソースから Web ページ モデルを構成しています。これらのソースは、通常の Xerces パーサーを使用して DOM オブジェクトとしてメモリに解析されています。残念ながら、Xerces DOM オブジェクトは読み取り専用操作に対してスレッド セーフではありません。解析された DOM を読み取り用に再利用できるようにしたいと考えています。私が使用している別のパーサーまたは読み取り DOM 実装に対して単純なスレッドセーフを知っている人はいますか?

4

2 に答える 2

4

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;

(saxon-he 9.5.1 でテスト済み)

于 2014-10-17T12:12:24.047 に答える
0

完璧で簡単な解決策はわかりません。

アイデアは、スレッドセーフなオブジェクトを使用して Dom を再作成することです。

この場合、読み取り専用であるため、 immutableであることが望ましいです。不変であることは、さらなる改善の可能性も開きます (たとえば、インスタンスの共有により、メモリ フットプリントが小さくなります)。

かなりの量のコーディングなので、これを行うライブラリを提案できたらいいのにと思います...

于 2009-10-01T15:21:19.450 に答える