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

时间:2015-07-24 13:06:37

标签: xml perl

我需要在已经存在的xml文件中添加一个节点,我的xml就像: -

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

在添加节点后,它应该看起来像

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

我尝试了以下链接的想法,但无法弄明白。 using perl insert string xml to a node

我需要添加节点并将更改保存到文件中。 它应该反映到文件中。 我是新来的,为什么不能弄明白。

我尝试的是: -

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

我得到的输出是: -

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

1 个答案:

答案 0 :(得分:2)

虽然代码from the linked answer by mirod做了你想做的同样的事情,但你需要调整它以适应你的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>

这不会从文件中读取,而是从DATA文件句柄读取,该句柄包含__DATA__以下的内容,只打印到终端/屏幕。

首先,您的预期输出是这样的:

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

但是你在代码中使用的要插入的XML片段是这样的:

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

那不是你想说的,所以我猜这是个错误。

您从答案中获取的代码应该适用于元素<grouping>。原则上它是相同的,但它有不同的名称。所以你需要调整代码。我更改了twig_handlers以获得Install的处理程序,因为这是XML的根元素。我继续重命名子程序和里面的变量以匹配它。它使得更清楚的是发生了什么。

如果你运行它,你会得到这个输出:

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