基本上,我正在从文件(数据库)创建XML文档,然后我将另一个已解析的XML文件(带有更新的信息)与原始数据库进行比较,然后将新信息写入数据库。 / p>
我正在使用java的org.w3c.dom。
经过多次努力之后,我决定只创建一个新的Document对象,并从那里写下oldDocument和newDocument,我正在比较中的元素。
XML文档采用以下格式:
<Log>
<File name="something.c">
<Warning file="something.c" line="101" column="23"/>
<Warning file="something.c" line="505" column="71" />
</File>
</Log>
作为一个例子。
我如何在“文件”中添加一个新的“警告”元素而不会得到令人讨厌的“org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR:一个节点用在与创建它的文档不同的文档中“。异常?
减少它,我有类似的东西:
public static Document update(Element databaseRoot, Element newRoot){
Document doc = db.newDocument(); // DocumentBuilder defined previously
Element baseRoot = doc.createElement("Log");
//for each file i have:
Element newFileRoot = doc.createElement("File");
//some for loop that parses through each 'file' and looks at the warnings
//when i come to a new warning to add to the Document:
NodeList newWarnings = newFileToCompare.getChildNodes(); //newFileToCompare comes from the newRoot element
for (int m = 0; m < newWarnings.getLength(); m++){
if(newWarnings.item(m).getNodeType() == Node.ELEMENT_NODE){
Element newWarning = (Element)newWarnings.item(m);
Element newWarningRoot = (Element)newWarning.cloneNode(false);
newFileRoot.appendChild(doc.importNode(newWarningRoot,true)); // this is what crashes
}
}
// for new files i have this which works:
newFileRoot = (Element)newFiles.item(i).cloneNode(true);
baseRoot.appendChild(doc.importNode(newFileRoot,true));
doc.appendChild(baseRoot);
return doc;
}
有什么想法吗?我正撞在墙上。第一次这样做。
答案 0 :(得分:0)
使用调试器我验证了文档所有者是正确的。使用node.getOwnerDocument(),我意识到newFileRoot在创建它之前已连接到错误的文档,所以我更改了
Element newFileRoot = (Element)pastFileToFind.cloneNode(false);
到
Element newFileRoot = (Element)doc.importNode(pastFileToFind.cloneNode(false),true);
从后来当我尝试将newWarningRoot添加到newFileRoot时,他们有不同的文档(newWarningRoot是正确的,但newFileRoot连接到错误的文档)