appendChild 处的 DOMException
DOMException at appendChild
我正在尝试使用 DOM 修改 XML 文档,方法是替换其中的一些元素,但出现以下异常:
03-10 10:49:20.943: W/System.err(22584): org.w3c.dom.DOMException
03-10 10:49:20.943: W/System.err(22584): at org.apache.harmony.xml.dom.InnerNodeImpl.insertChildAt(InnerNodeImpl.java:118)
03-10 10:49:20.943: W/System.err(22584): at org.apache.harmony.xml.dom.InnerNodeImpl.appendChild(InnerNodeImpl.java:52)
XML 文档具有以下层次结构:
<?xml version="1.0" encoding="UTF-8"?>
<msg>
<header>
<method>Call</method>
</header>
</msg>
我正在尝试使用 replaceChild()
方法将元素 header
替换为另一个:
doc.replaceChild(header, (Element)doc.getElementsByTagName("header").item(0));
但我遇到了上述异常。因此,我跟踪异常以查看它被抛出的位置,这使我找到了 org.apache.harmony.xml.dom.InnerNodeImpl
Class 中的以下行:
public Node removeChild(Node oldChild) throws DOMException {
LeafNodeImpl oldChildImpl = (LeafNodeImpl) oldChild;
if (oldChildImpl.document != document) {
throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null);
}
if (oldChildImpl.parent != this) {
throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, null); // This is where the Exception got thrown
}
int index = oldChildImpl.index;
children.remove(index);
oldChildImpl.parent = null;
refreshIndices(index);
return oldChild;
}
这意味着它无法将元素 header 识别为不正确的文档的子元素,那么,我在这里遗漏了什么?!!
作为参考,以下是我在这个过程中使用的整个方法:
private void forming_and_sending_xml(String message, Element header){
Document doc = null;
try {
doc = loadXMLFromString(message);
} catch (Exception e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();
doc.replaceChild(header, (Element)doc.getElementsByTagName("header").item(0)); // this is where I got the Exception
}
更新
我改变了替换元素的方式,我使用importNode
将节点添加到文档中,然后我将替换过程分离为(删除 - >添加),这使我能够解决所有问题与删除过程相关,现在元素已成功删除,但文档不批准添加新元素,它会抛出与上述相同的异常。
我的新方法:
private void forming_and_sending_xml(String message, Element header){
Document doc = null;
try {
doc = loadXMLFromString(message);
} catch (Exception e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();
doc.importNode(header, true);
Element header_holder = (Element)doc.getElementsByTagName("header").item(0);
header_holder.getParentNode().removeChild(header_holder); // this removes the Element from the Doc succeffully
doc.getDocumentElement().appendChild(header); // this is where the Exception is got thrown now
}
我猜这里有两个错误:
必须将新的 <header>
元素导入到现有文档中(如评论中已讨论的那样),并且
oldChild
节点必须是上下文节点的 直接 子节点,而不是示例中的孙节点。替换
doc.replaceChild(header, (Element)doc.getElementsByTagName("header").item(0));
和
doc.getDoumentElement().
replaceChild(doc.importNode(header, true),
(Element)doc.getElementsByTagName("header").item(0));
我正在尝试使用 DOM 修改 XML 文档,方法是替换其中的一些元素,但出现以下异常:
03-10 10:49:20.943: W/System.err(22584): org.w3c.dom.DOMException
03-10 10:49:20.943: W/System.err(22584): at org.apache.harmony.xml.dom.InnerNodeImpl.insertChildAt(InnerNodeImpl.java:118)
03-10 10:49:20.943: W/System.err(22584): at org.apache.harmony.xml.dom.InnerNodeImpl.appendChild(InnerNodeImpl.java:52)
XML 文档具有以下层次结构:
<?xml version="1.0" encoding="UTF-8"?>
<msg>
<header>
<method>Call</method>
</header>
</msg>
我正在尝试使用 replaceChild()
方法将元素 header
替换为另一个:
doc.replaceChild(header, (Element)doc.getElementsByTagName("header").item(0));
但我遇到了上述异常。因此,我跟踪异常以查看它被抛出的位置,这使我找到了 org.apache.harmony.xml.dom.InnerNodeImpl
Class 中的以下行:
public Node removeChild(Node oldChild) throws DOMException {
LeafNodeImpl oldChildImpl = (LeafNodeImpl) oldChild;
if (oldChildImpl.document != document) {
throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null);
}
if (oldChildImpl.parent != this) {
throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, null); // This is where the Exception got thrown
}
int index = oldChildImpl.index;
children.remove(index);
oldChildImpl.parent = null;
refreshIndices(index);
return oldChild;
}
这意味着它无法将元素 header 识别为不正确的文档的子元素,那么,我在这里遗漏了什么?!!
作为参考,以下是我在这个过程中使用的整个方法:
private void forming_and_sending_xml(String message, Element header){
Document doc = null;
try {
doc = loadXMLFromString(message);
} catch (Exception e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();
doc.replaceChild(header, (Element)doc.getElementsByTagName("header").item(0)); // this is where I got the Exception
}
更新
我改变了替换元素的方式,我使用importNode
将节点添加到文档中,然后我将替换过程分离为(删除 - >添加),这使我能够解决所有问题与删除过程相关,现在元素已成功删除,但文档不批准添加新元素,它会抛出与上述相同的异常。
我的新方法:
private void forming_and_sending_xml(String message, Element header){
Document doc = null;
try {
doc = loadXMLFromString(message);
} catch (Exception e) {
e.printStackTrace();
}
doc.getDocumentElement().normalize();
doc.importNode(header, true);
Element header_holder = (Element)doc.getElementsByTagName("header").item(0);
header_holder.getParentNode().removeChild(header_holder); // this removes the Element from the Doc succeffully
doc.getDocumentElement().appendChild(header); // this is where the Exception is got thrown now
}
我猜这里有两个错误:
必须将新的
<header>
元素导入到现有文档中(如评论中已讨论的那样),并且oldChild
节点必须是上下文节点的 直接 子节点,而不是示例中的孙节点。替换doc.replaceChild(header, (Element)doc.getElementsByTagName("header").item(0));
和
doc.getDoumentElement(). replaceChild(doc.importNode(header, true), (Element)doc.getElementsByTagName("header").item(0));