2012-06-05 4 views
1

Я пишу функцию, которая необходимо добавить узел к данному Node в документе XML.importNode бросает исключение org.w3c.dom.DOMException

Вот реализация этой функции:

/** 
* Adds the node aNewChild to the end of the list of children of this node. 
* If the newChild is already in the tree, it is first removed. 
* @param aNewChild The node to add.If it is a DocumentFragment object, 
*     the entire contents of the document fragment are moved 
*     into the child list of this node 
* @return The node added or null. 
*/ 
public Node AddNode(Node aNode, Node aOldNode) { 
    Log.i(TAG, "AddNode()"); 

    if (aNode == null) { 
     Log.e(TAG, "aNode is null!"); 
     return null; 
    } 

    if (aOldNode == null) { 
     Log.e(TAG, "aOldNode is null!"); 
     return null; 
    } 

    Document document = aNode.getOwnerDocument(); 

    aOldNode = document.importNode(aOldNode, true); 

    return aNode.appendChild(aOldNode); 

} /* Node AddNode(Node aNode, Node aOldNode) **/ 

Этот код запустить большой на Android 4.0.3 без проблем, функция добавления узла к данному узлу без ошибок, но когда я запускаю этот код под Android 2.3 .3 функция аварии на линии aOldNode = document.importNode(aOldNode, true);, когда я пытаюсь добавить попытаться поймать блок, как это:

try { 
    aOldNode = document.importNode(aOldNode, true); 
} 
catch(Exception ex) { 
    Log.e(TAG, ex.getMessage()); 
} 

Я вижу только null вместо сообщения об ошибке. Кто знает, в чем причина?

Вот исключение:

06-05 17:58:09.111: I/TestRunner(2769): ----- begin exception ----- 
06-05 17:58:09.122: I/TestRunner(2769): org.w3c.dom.DOMException 
06-05 17:58:09.122: I/TestRunner(2769):  at org.apache.harmony.xml.dom.NodeImpl.setNameNS(NodeImpl.java:227) 
06-05 17:58:09.122: I/TestRunner(2769):  at org.apache.harmony.xml.dom.ElementImpl.<init>(ElementImpl.java:50) 
06-05 17:58:09.122: I/TestRunner(2769):  at org.apache.harmony.xml.dom.DocumentImpl.createElementNS(DocumentImpl.java:336) 
06-05 17:58:09.122: I/TestRunner(2769):  at org.apache.harmony.xml.dom.DocumentImpl.shallowCopy(DocumentImpl.java:156) 
06-05 17:58:09.122: I/TestRunner(2769):  at org.apache.harmony.xml.dom.DocumentImpl.cloneOrImportNode(DocumentImpl.java:208) 
06-05 17:58:09.122: I/TestRunner(2769):  at org.apache.harmony.xml.dom.DocumentImpl.importNode(DocumentImpl.java:222) 
06-05 17:58:09.122: I/TestRunner(2769):  at com.fido.android.framework.service.XMLDOMNode.AddNode(XMLDOMNode.java:108) 
06-05 17:58:09.122: I/TestRunner(2769):  at com.fido.android.test.framework.service.XMLDOMNodeTest.testAddNodeNodeNode(XMLDOMNodeTest.java:89) 
06-05 17:58:09.122: I/TestRunner(2769):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-05 17:58:09.122: I/TestRunner(2769):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-05 17:58:09.122: I/TestRunner(2769):  at junit.framework.TestCase.runTest(TestCase.java:154) 
06-05 17:58:09.122: I/TestRunner(2769):  at junit.framework.TestCase.runBare(TestCase.java:127) 
06-05 17:58:09.122: I/TestRunner(2769):  at junit.framework.TestResult$1.protect(TestResult.java:106) 
06-05 17:58:09.122: I/TestRunner(2769):  at junit.framework.TestResult.runProtected(TestResult.java:124) 
06-05 17:58:09.122: I/TestRunner(2769):  at junit.framework.TestResult.run(TestResult.java:109) 
06-05 17:58:09.122: I/TestRunner(2769):  at junit.framework.TestCase.run(TestCase.java:118) 
06-05 17:58:09.122: I/TestRunner(2769):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
06-05 17:58:09.122: I/TestRunner(2769):  at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
06-05 17:58:09.122: I/TestRunner(2769):  at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
06-05 17:58:09.122: I/TestRunner(2769):  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448) 
06-05 17:58:09.132: I/TestRunner(2769): ----- end exception ----- 

Как я могу понять importNode функция глючит, что еще я могу использовать, чтобы добавить узел к узлу?

ответ

0

Я нашел решение, и это работает для меня, здесь модифицирована функция, добавить узел в узел, не бросать никаких исключений:

/** 
    * Adds the node aNewChild to the end of the list of children of this node. 
    * If the newChild is already in the tree, it is first removed. 
    * @param aNewChild The node to add.If it is a DocumentFragment object, 
    *     the entire contents of the document fragment are moved 
    *     into the child list of this node 
    * @return The node added or null. 
    */ 
    public Node AddNode(Node aNode, Node aOldNode) { 
     CustomLog.i(TAG, "AddNode()"); 

     if (aNode == null) { 
      CustomLog.e(TAG, "aNode is null!"); 
      return null; 
     } 

     if (aOldNode == null) { 
      CustomLog.e(TAG, "aOldNode is null!"); 
      return null; 
     } 

     Document document = aNode.getOwnerDocument(); 

     aOldNode = document.adoptNode(aOldNode); 

     return aNode.appendChild(aOldNode); 

    } /* Node AddNode(Node aNode, Node aOldNode) **/ 

Я просто использовать aOldNode = document.adoptNode(aOldNode); вместо aOldNode = document.importNode(aOldNode, true); метода.

Смежные вопросы