xmlperlxml-twig

How can I add an attribute to a child element using Perl's XML::Twig?


I have an XML string like this:

<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA />
</DATA>

The final output I want is:

<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA ATVAL="value2"/>
</DATA>

My twig $t is at <DATA>. Now I want to add an attribute to the second <CHILD_DATA />. The attribute is ATVAL="value2". I tried the following:

$t->last_child('CHILD_DATA')->set_att{"ATVAL","value2"};

This didn't work. What's wrong with this code? Is there another way to do this?


Solution

  • As Jon hinted to you, you have a syntax error in the code you posted. You should have seen a compile error like:

    syntax error at test line 18, near "->set_att{" Execution of program.pl aborted due to compilation errors.

    However, you might have typed the code into your answer so that code doesn't match what you are actually doing. Always put the actual code into your question rather than re-typing it, and always post a full program when you can. When you post your program, I don't have to start from scratch to debug what I think you might be doing. :)

    Here's a program that does what you want:

    use XML::Twig;
    
    my $xml = <<'XML';
    <DATA>
       <CHILD_DATA ATVAL="value1"/>
       <CHILD_DATA />
    </DATA>
    XML
    
    my $twig= XML::Twig->new( keep_spaces => 1 );
    
    $twig->parse( $xml );
    
    $twig
        ->root
        ->last_child('CHILD_DATA')
        ->set_att("ATVAL" => "value2");
    
    $twig->flush;