見つけた子供の要素を削除できないのはなぜですか? not_found_err
-
03-10-2019 - |
質問
ある要素のリストを別の要素に置き換えるなど、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行目には以下にラベル付けされています。)私が理解している限り、要素が存在することを確認しました(ノデリストがライブであるため、最初のエントリは常に次のマッチまたは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(ノード)を実行している場合、getElementsByTagname()が再帰検索を行っているため、親は必ずしもノードの親ではないためです。
他のヒント
どうですか
nodeToBeRemoved.getParentNode().removeChild(nodeToBeRemoved);
parent.removeChild(node)
NOT_FOUND_ERRを投げています node
の子供ではありません parent
. 。私はそれを見る node
から来た getElementsByTagName
これはすぐに子供ではないかもしれません parent
. 。それはどこにでもあるかもしれません parent
.
@mauriceと@fahdによる診断に基づいて...
以前に状態を置くことはできません
parent.removeChild(node);
そのような
if (parent.isSameNode(node.getParentNode()))
その後、指定された親の直接の子を削除するだけです。
所属していません StackOverflow