Я пишу функцию, которая должна добавить узел к данному узлу в документе XML.
Вот реализация этой функции:
/**
* 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);
строя на aOldNode = document.importNode(aOldNode, true);
когда я пытаюсь добавить блок catch catch следующим образом:
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
- это функция с ошибкой, что еще я могу использовать для добавления узла в узел?
Я нашел решение, и он работает для меня, здесь изменена функция, которая добавляет узел к узлу без какого-либо исключения:
/**
* 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);
метод.