如何使用PerlXML::Twig将节点添加到XML文件

如何使用PerlXML::Twig将节点添加到XML文件,xml,perl,Xml,Perl,我需要向已经存在的xml文件中添加一个节点,我的xml如下所示:- <Install> <version > <number>6.1</number> <build>1025654</build> <path>path</path> <kind>RIBS</kind> </version> </Install>

我需要向已经存在的xml文件中添加一个节点,我的xml如下所示:-

<Install>
  <version >
    <number>6.1</number>
    <build>1025654</build>
    <path>path</path>
    <kind>RIBS</kind>
  </version>
</Install>

6.1
1025654
路径
肋骨
在添加节点之后,它应该是

<Install>
  <version >
    <number>6.1</number>
    <build>1025654</build>
    <path>path</path>
    <kind>native</kind>
  </version>
  <version >
    <number>6.0</number>
    <build>1025786</build>
    <path>path</path>
    <kind>native</kind>
  </version>
</Install>

6.1
1025654
路径
本地的
6
1025786
路径
本地的
我从下面的链接尝试了这个想法,但没能找到答案。

我需要添加节点并保存对文件的更改。 它应该反映到文件中。 我对perl还不熟悉,为什么不能理解它呢

我尝试的是:-

use strict;
use warnings;

use XML::Twig;

my $myXML
  ='<version>6.1</version>
    <number>101445</number>
    <path>path</path>
    <kind>native</kind>
   ';
my $file = "C:\\Users\\bjoshi\\LightroomBuilds\\Win\\data.xml";
my $t= XML::Twig->new( twig_handlers => { grouping => sub { grouping( $myXML, @_); }, })
                ->parsefile( "$file") or die $!;

$t->print;
open my $xml_fh, '>', "$file" or die $!;
$t->set_pretty_print('indented_c');
$t->print($xml_fh);
exit;

sub grouping
  { my( $xml, $t, $grouping)= @_;
    my $new_elt= XML::Twig::Elt->parse( $xml);
    $new_elt->paste( last_child => $grouping);
  }
使用严格;
使用警告;
使用XML::Twig;
我的$myXML
='6.1
101445
路径
本地的
';
my$file=“C:\\Users\\bjoshi\\LightroomBuilds\\Win\\data.xml”;
my$t=XML::Twig->new(Twig_处理程序=>{grouping=>sub{grouping($myXML,@)},})
->parsefile(“$file”)或die$!;
$t->打印;
打开我的$xml_fh,“>”、“$file”或die$!;
$t->set_pretty_print('indented_c');
$t->print($xml\u fh);
出口
子分组
{my($xml,$t,$grouping)=@;
我的$new_elt=XML::Twig::elt->parse($XML);
$new\u elt->paste(最后一个子项=>$grouping);
}
我得到的输出是:-

<Install>
  <version>
    <number>6.1</number>
    <build>1025654</build>
    <path>path</path>
    <kind>native</kind>
  </version>
</Install>

6.1
1025654
路径
本地的
虽然代码做了与您想做的相同的事情,但您需要调整它以适合您的XML。我会在下面解释我做了什么

use strict;
use warnings;
use XML::Twig;

my $myXML = <<'XML';
<version>
  <number>6.0</number>
  <build>1025786</build>
  <path>path</path>
  <kind>native</kind>
</version>
XML

my $t = XML::Twig->new(
  twig_handlers => {
    Install => sub { add_version( $myXML, @_ ); }, }
  )->parse( \*DATA ) or die $!;

$t->set_pretty_print('indented_c');
$t->print;

sub add_version {
    my ( $xml, $t, $install ) = @_;
    my $new_elt = XML::Twig::Elt->parse($xml);
    $new_elt->paste( last_child => $install );
}

__DATA__
<Install>
  <version >
    <number>6.1</number>
    <build>1025654</build>
    <path>path</path>
    <kind>RIBS</kind>
  </version>
</Install>
但在代码中使用的要插入的XML如下所示:

<Install>
  ...
  <version>
    <number>6.0</number>
    ...
  </version>
</Install>
<version>6.1</version>
<number>101445</number>
...

请展示你已经尝试过的东西。你的问题,并把代码,你写的帮助下,你的答案链接。看起来这个答案应该对你有用。@simbabque我已经编辑了问题并在那里添加了我的代码。你的
$myXML
不正确。将您提供的预期输出与您所做的进行比较。元素嵌套不正确。@simbabque我已经更新了$myXML,但没有更新到xml文件中。谢谢,有没有办法在$myXML中使用变量??如果使用双引号,它将插入变量。如果这对您来说是新的,我建议您购买一些perl书籍。TagWiki有一个很好的免费资源和书籍推荐列表:-)
<Install>
  <version>
    <number>6.1</number>
    <build>1025654</build>
    <path>path</path>
    <kind>RIBS</kind>
  </version>
  <version>
    <number>6.0</number>
    <build>1025786</build>
    <path>path</path>
    <kind>native</kind>
  </version>
</Install>