http://www.perlmonks.org?node_id=1055605


in reply to NOT_FOUND_ERR in insertAfter()

Change the "insert" line to :
$ele->parentNode->insertAfter($new_ele,$ele);
and it works.

"insertAfter" is a method for a NODE, not a doc (DOM object).

If I understand it right, the "NOT_FOUND" error was raised because $ele is not a direct child of $doc.

             My goal ... to kill off the slow brain cells that are holding me back from synergizing my knowledge of vertically integrated mobile platforms in local cloud-based content management system datafication.

Replies are listed 'Best First'.
Re^2: NOT_FOUND_ERR in insertAfter()
by boftx (Deacon) on Sep 25, 2013 at 05:25 UTC

    Update

    I tested the change above, and found that it does not correct the problem, you need to use the form I have below with undef as the second arg to insertAfter. It is possible that this is a result of different versions, so test for yourself.

    End update

    I was just going to post the same thing as above after a quick test script. Here is the output produced by making the change:

    <?xml version="1.0" encoding="utf-8"?> <University> <students> <student id="1000"/> <student id="1001"><student id="1003"/></student> <student id="1002"/> </students> </University>

    On a different note, you should always have use strict; and use warnings; as well as check for critical failures in your code, like this:

    #!/usr/bin/perl use strict; use warnings; use XML::LibXML; my $parser = XML::LibXML->new(); # this call should probably be wrapped in an eval (or Try::Tiny) or at + least # tested for a valid object being returned. my $doc = $parser->parse_file('student.xml'); my $query = '//student'; for my $ele ($doc->findnodes($query)){ my $attr_text=$ele->getAttribute('id'); if($attr_text eq '1001'){ my $new_ele=$doc->createElement('student'); $new_ele->setAttribute('id','1003'); $ele->insertAfter($new_ele,undef); last; } } # if you can't open the file you want to know why open(TESTFILE,">result.xml") or die "Can not open output: $!"; print TESTFILE $doc->toString; close(TESTFILE); exit; __END__
    On time, cheap, compliant with final specs. Pick two.
      Sorry - but your code is incorrect.

      The main problem is that the output XML has the 1003 student EMBEDDED INSIDE the 1001, which I do not think is the desired result.

      my code produces:

      <?xml version="1.0" encoding="utf-8"?> <University> <students> <student id="1000"/> <student id="1001"/><student id="1003"/> <student id="1002"/> </students> </University>
      which , I believe is what the OP wanted.

                   My goal ... to kill off the slow brain cells that are holding me back from synergizing my knowledge of vertically integrated mobile platforms in local cloud-based content management system datafication.

        I agree that your output is more desirable. I suspect that there is some version difference accounting for what we are seeing. I used your code and got the same error that the OP reported, even though, like you, I know his error was caused by using $doc instead of $ele. That is why I suggested that the OP try both your code and mine.

        Hmmm, would have helped if I had logged in before replying to you. :)

        On time, cheap, compliant with final specs. Pick two.