如何使用Perl的XML :: Twig向子元素添加属性?

Nin*_*nja 2 xml perl xml-twig

我有一个像这样的XML字符串:

<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA />
</DATA>
Run Code Online (Sandbox Code Playgroud)

我想要的最终输出是:

<DATA>
   <CHILD_DATA ATVAL="value1"/>
   <CHILD_DATA ATVAL="value2"/>
</DATA>
Run Code Online (Sandbox Code Playgroud)

我的树枝$t在<DATA>.现在我想为第二个添加一个属性<CHILD_DATA />.属性是ATVAL="value2".我尝试了以下方法:

$t->last_child('CHILD_DATA')->set_att{"ATVAL","value2"};
Run Code Online (Sandbox Code Playgroud)

这没用.这段代码出了什么问题?还有另一种方法吗?

bri*_*foy 6

正如Jon向您暗示的那样,您发布的代码中存在语法错误.你应该看到一个编译错误,如:

测试行18处的语法错误,接近" - > set_att {"程序.pl的执行由于编译错误而中止.

但是,您可能已在代码中键入代码,因此代码与您实际执行的操作不匹配.始终将实际代码放入您的问题而不是重新输入,并始终发布完整的程序.当你发布你的程序时,我不必从头开始调试我认为你可能正在做的事情.:)

这是一个做你想要的程序:

#!/usr/bin/perl

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 );

    $t = $twig->root;

    $t->last_child('CHILD_DATA')->set_att("ATVAL" => "value2");

$twig->flush;
Run Code Online (Sandbox Code Playgroud)

  • @Ninja,我不知道你是如何看待你的代码的,但是如果你是新手,我怀疑你没有使用一个好的程序员字体,这显示了{和(.)之间的细微差别.差距非常明显,很容易从几英尺外发现.:) (3认同)