将子元素添加到元素java(DOM)

时间:2015-10-14 20:27:16

标签: java xml dom element

基本上,我正在从文件(数据库)创建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;
}

有什么想法吗?我正撞在墙上。第一次这样做。

1 个答案:

答案 0 :(得分:0)

使用调试器我验证了文档所有者是正确的。使用node.getOwnerDocument(),我意识到newFileRoot在创建它之前已连接到错误的文档,所以我更改了

Element newFileRoot = (Element)pastFileToFind.cloneNode(false);

Element newFileRoot = (Element)doc.importNode(pastFileToFind.cloneNode(false),true);

从后来当我尝试将newWarningRoot添加到newFileRoot时,他们有不同的文档(newWarningRoot是正确的,但newFileRoot连接到错误的文档)