Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy can I not remove a child element I've just found? NOT_FOUND_ERR
    primarykey
    data
    text
    <p>I'm building a script which has to patch XML files, including replacing one list of elements with another. The following function applies a patch (involving a possibly empty list of elements with the same name) onto a parent Element's list of elements by the same name (also possibly an empty list). (This is only a small part of the patching logic).</p> <p>Why, when I run the code, do I get the following error?</p> <pre><code>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) </code></pre> <p>(Line 514 is labelled below.) As far as I understand it, I've just verified that the element exists (because NodeList is live, its first entry will always be the next match or null). Interestingly, this isn't always a problem.</p> <pre><code>private static class PTReplaceNodeList extends PTBase { private final String name; private final String nextElement; private final List&lt;Node&gt; 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(); } } </code></pre> <p>Edit: I used the following function as a replacement for <code>getElementsByTagName()</code> (see accepted answer).</p> <pre><code>/** Returns all direct children of node with name name. * * Note: not the same as getElementsByTagName(), which finds all descendants. */ static List&lt;Node&gt; getChildNodes( Node node, String name ){ ArrayList&lt;Node&gt; r = new ArrayList&lt;Node&gt;(); NodeList children = node.getChildNodes(); int l = children.getLength(); for( int i = 0; i &lt; l; ++i ){ if( name.equals( children.item(i).getNodeName() ) ) r.add( children.item(i) ); } return r; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload