rsriram has asked for the wisdom of the Perl Monks concerning the following question:

Hello,

I want to renumber the id values for a set of tags in a XML file. For example, I want to sequentially insert id's for <p> element. The result should be

<p id="1">
<p id="2">
<p id="3">...

I tried using counters, but it does'nt work. Can any one tell me how to do it?

Sriram

Replies are listed 'Best First'.
Re: Renumbering ID values for XML tags
by prasadbabu (Prior) on Jun 23, 2006 at 10:23 UTC

    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

      No need for the regex, just:

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

      -derby

      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

Re: Renumbering ID values for XML tags
by davorg (Chancellor) on Jun 23, 2006 at 10:36 UTC
    I tried using counters, but it does'nt work

    Perhaps if you showed us what you had tried then we could help you find the problems. Just saying that something doesn't work isn't really very helpful.

    --
    <http://dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg