in reply to Renumbering ID values for XML tags

Hi rsriram,

You can do that using XML::Twig. Take a look at 'add_id' method in that. From XML::Twig documentation,

add_id Add an id to the element. The id is an attribute (id by default, see the id option for XML::Twig + new to change it. Use an id starting with # to get an id that's not +output by print, flush or sprint) that allows you to use the elt_id m +ethod to get the element easily. set_id_seed ($prefix) by default the id generated by add_id is twig_id_<nnnn>, set_id_seed c +hanges the prefix to $prefix and resets the number to 1

Here is one way to do it.

use strict; use XML::Twig; my $string = '<xml> <p>here the paragraph comes</p> <p>here the paragraph comes</p> <p>here the paragraph comes</p> </xml>'; my $twig = new XML::Twig( twig_handlers => { p => sub { $_->add_id() }, #insert element id }, pretty_print => 'indented' #print format ); $twig->set_id_seed( '' ); $twig->parse($string); $string = $twig->sprint; print $string; output: ------- <xml> <p id="1">here the paragraph comes</p> <p id="2">here the paragraph comes</p> <p id="3">here the paragraph comes</p> </xml>
updated: added set_id_seed instead of regex. derby thanks :)

Prasad

Replies are listed 'Best First'.
Re^2: Renumbering ID values for XML tags
by derby (Abbot) on Jun 23, 2006 at 12:01 UTC

    No need for the regex, just:

    $twig->set_id_seed( '' );
    before the parse call.

    -derby
Re^2: Renumbering ID values for XML tags
by rsriram (Hermit) on Jun 23, 2006 at 13:46 UTC

    Thank you for your reply Prasad, I was quite successful in inserting id to the XML file using the XML::Twig. But I do not want the XML to be parsed. My XML file may not be structured. The code I have with me...

    #use strict;
    use XML::Twig;
    my $string = '<xml><p>This is a string</p><p>This is a string</p><p>This is a string</p></xml>';
    my $twig = new XML::Twig(
            twig_handlers => {
               p => sub { $_->add_id() },
    },
             pretty_print => 'indented' #print format
    );
    $twig->set_id_seed( '' );
    $twig->parse($string);
    $string = $twig->sprint;
    print $string;

    Sriram

      Hi rsriram,

      I think if your XML file is not well-formed you cannot process your file with XML::Twig. Instead you can do using regex. Before that you have to select the required <p> for processing id.

      After selecting required paragraphs <p>, you can do something like this.

      use strict; use XML::Twig; my $string = '<xml> <p>here the paragraph comes</p> <p>here the paragraph comes</p> <p>here the paragraph comes</p> <p>here the paragraph comes</p> </xml>'; my $i =1; $string =~ s/<p>/'<p id="'.$i++.'">'/egs; print $string; output: ------- <xml> <p id="1">here the paragraph comes</p> <p id="2">here the paragraph comes</p> <p id="3">here the paragraph comes</p> <p id="4">here the paragraph comes</p> </xml>

      Prasad