2

次のような XML ファイルを書き込むメソッドがあります。

private void doProcess() {

    Element rootElement = mDoc.createElement("Test");
    mDoc.appendChild(rootElement);

....... I build the whole document here... 
}

ただし、このメソッドは複数のスレッドから呼び出すことができるため、たとえば、2 つのスレッドが同時にこのメソッドを呼び出すと、

): org.w3c.dom.DOMException: Only one root element allowed

再入可能ロックですでに試しましたが、うまくいきませんでした...誰かヒントを教えてください。

編集:

複数のスレッドを使用してドキュメントを構築することはありません...メソッドを呼び出すたびに独自のドキュメントが構築されます...そのため、アプリケーションで、メソッドが同時に 2 回呼び出されることがあります...そして、私の問題...

4

2 に答える 2

2

あなたが述べる質問で:

複数のスレッドでドキュメントを作成しません...メソッドを呼び出すたびに、独自のドキュメントが作成されます

現在、指定されたコードは、関数へのすべての呼び出し間で 1 つのドキュメントを共有しています。関数への各呼び出しを独自のドキュメントで機能させるには、各呼び出しが独自のドキュメントを持つようにコードを変更する必要があります。

これは、新しいドキュメント オブジェクトを作成して返すことによって実行できます。

private XMLDocument doProcess() {
  XMLDocument mDoc = new XMLDocument(); // or simmilar depending on XML library
  Element rootElement = mDoc.createElement("Test");
  mDoc.appendChild(rootElement);

  // ....... I build the whole document here... 

  return mDoc; //return the document object
}

または、ドキュメント オブジェクトをパラメータとして渡すことによって

private void doProcess(XMLDocument mDoc) { ... }
于 2013-10-31T09:13:05.260 に答える
1

xml にはルートが 1 つしかないため、これが質問への回答になる可能性があります。このメソッドの外側でルート要素をインスタンス化し、毎回メソッド内でこのルートに要素を追加できます。

于 2013-10-31T08:39:27.873 に答える