org.w3c.dom.DOMException не имеет подробного сообщения при replaceChild()

#java #dom

#java #dom

Вопрос:

Я пытаюсь заменить узел документа на другой узел с той же структурой из другого документа (остальная структура и происхождение двух документов различны), используя этот метод:

  public static void replaceLines(Document target, Document source){
        Node sourceNode =source.getElementsByTagName("lines").item(0);
        Node targetNode=target.getElementsByTagName("lines").item(0);
        target.getChildNodes().item(0).replaceChild(sourceNode,targetNode);
    }
  

Обратите внимание, что:

 target.getElementsByTagName("lines").item(0) = target.getChildNodes().item(0)
  

И я получаю это исключение:

 10-20 16:19:48.259 20021-20021/myapp.mygestion E/AndroidRuntime: 
FATAL EXCEPTION: main
Process: myapp.mygestion, PID: 20021
org.w3c.dom.DOMException
    at org.apache.harmony.xml.dom.InnerNodeImpl.insertChildAt(InnerNodeImpl.java:118)
    at org.apache.harmony.xml.dom.InnerNodeImpl.replaceChild(InnerNodeImpl.java:199)
    at mygestion.com.utiles.XmlEditor.replaceLines(XmlEditor.java:128)
    at mygestion.com.DetalleFicha$9.onPostExecute(DetalleFicha.java:1078)
    at android.os.AsyncTask.finish(AsyncTask.java:636)
    at android.os.AsyncTask.access$500(AsyncTask.java:177)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5637)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
  

Как я уже сказал, у него нет подробного сообщения, и я не могу найти причину ошибки, есть идеи?

Ответ №1:

Похоже, что исключение генерируется при попытке заменить узел из исходного документа в целевой документ. Как указано в replaceChild(Node newChild, Node oldChild) Javadoc, DOMException генерируется, если новый дочерний элемент создается из другого документа. Вы должны попытаться клонировать узел, создать его с целевым документом, а затем добавить / заменить его.