Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: NOT_FOUND_ERR in insertAfter()

by NetWallah (Abbot)
on Sep 25, 2013 at 05:09 UTC ( #1055605=note: print w/ replies, xml ) Need Help??


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.


Comment on Re: NOT_FOUND_ERR in insertAfter()
Download Code
Re^2: NOT_FOUND_ERR in insertAfter()
by boftx (Chaplain) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1055605]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (3)
As of 2014-09-16 02:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (155 votes), past polls