为什么不能删除刚刚找到的子元素?NOT_FOUND_ERR

我正在构建一个脚本,该脚本必须修补XML文件,包括用一个元素列表替换另一个元素列表。以下函数将补丁(涉及到具有相同名称的元素的可能为空的列表)应用于父元素具有相同名称的元素的列表(也可能为空的列表)。(这只是修补逻辑的一小部分)。

为什么在运行代码时出现以下错误?

org.w3c.dom.DOMException: NOT_FOUND_ERR: An attempt is made to reference a node in a context where it does not exist.

at com.sun.org.apache.xerces.internal.dom.ParentNode.internalRemoveChild(ParentNode.java:503)

at com.sun.org.apache.xerces.internal.dom.ParentNode.removeChild(ParentNode.java:484)

at CombineSweeps$PTReplaceNodeList.apply(CombineSweeps.java:514)

(下面标记了514行。)据我了解,我刚刚验证了该元素存在(因为NodeList是活动的,因此它的第一个条目将始终是下一个匹配项或为null)。有趣的是,这并不总是一个问题。

private static class PTReplaceNodeList extends PTBase {

private final String name;

private final String nextElement;

private final List<Node> childList;

...

int apply(Document document, Node parent, Node node_unused) {

NodeList nodes;

// A marker for where to insert our nodes.

// We make a guess using nextElement (if null, means at end).

Node refNode = null;

if (parent instanceof Document) { // root element

Document parDoc = (Document) parent;

nodes = parDoc.getElementsByTagName(name);

if (nextElement != null) {

refNode = parDoc.getElementsByTagName(nextElement).item(0);

}

} else {

Element parElt = (Element) parent;

nodes = parElt.getElementsByTagName(name);

if (nextElement != null) {

refNode = parElt.getElementsByTagName(nextElement).item(0);

}

}

while (true) {

// iterate through the list of nodes

Node node = nodes.item(0);

if (node == null) {

break;

}

// Reliable guess: insert before node following last in list

refNode = node.getNextSibling();

parent.removeChild(node); // line 514

}

for (Node child : childList) {

Node imported = document.importNode(child, true);

parent.insertBefore(imported, refNode);

}

return childList.size();

}

}

编辑:我用以下功能代替getElementsByTagName()(请参阅接受的答案)。

/** Returns all direct children of node with name name.

*

* Note: not the same as getElementsByTagName(), which finds all descendants. */

static List<Node> getChildNodes( Node node, String name ){

ArrayList<Node> r = new ArrayList<Node>();

NodeList children = node.getChildNodes();

int l = children.getLength();

for( int i = 0; i < l; ++i ){

if( name.equals( children.item(i).getNodeName() ) )

r.add( children.item(i) );

}

return r;

}

回答:

这是因为当您执行parent.removeChild(node)时,parent不一定是节点的父级,因为getElementsByTagName()正在进行递归搜索。

以上是 为什么不能删除刚刚找到的子元素?NOT_FOUND_ERR 的全部内容, 来源链接: utcz.com/qa/403856.html

回到顶部