2013-10-31 53 views
2

我有寫了一個基於XML的文件這樣的方法:兩個線程調用一個方法

private void doProcess() { 

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

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

但是這種方法可以由多個線程調用,因此,例如,如果thwo線程調用該方法在同一一次,我得到一個

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

我已經與ReentrantLock的嘗試,但是,這個didn't工作...有人可以給我一個提示?

編輯:

我不建立多線程的文件...我的方法的每個呼叫建立自己的文件......所以有時我的應用程序是可能發生的我的方法將被調用兩次同一時間...這是我的問題...

+1

甲'Document'只能有一個根元件。您需要直接將子元素添加到該元素。您不能簡單地將多個元素添加到「Doc​​ument」中,因爲這會導致多個根元素。請注意,'Document'不是線程安全的,因此對'Document'的所有操作都非常「同步」。 –

+1

錯誤是關於文件有多個'root'元素,這不是一個線程的事情。 – 2013-10-31 08:37:40

+0

在父線程中創建根節點並在子線程中添加元素。 – Kishore

回答

2

在這個問題你的狀態:

我不建立多線程的文件...我的方法的每個呼叫建立自己的文件

目前給出的代碼共享單個文檔在所有的函數調用之間。爲了使每個調用函數在它自己的文檔上工作,您需要修改代碼,以便每個調用都有自己的文檔。

這可以通過創建並返回一個新的文檔對象

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) { ... } 
1

一個XML只能有一個根,所以這可能是你的問題的答案。您可以在此方法外部實例化一個根元素,並且每次將元素添加到此根內部方法中。

相關問題