如何读取xml文件并通过编辑将节点复制到同一文件中

时间:2015-01-08 07:30:19

标签: xml

我是Stack溢出的新手,这是我的第一个问题。 [如果我在任何地方都错了,请纠正]

现在我要做的是:

  • 读取xml文件说(abc.xml),其中包含近1000个名为<build>的标签。在此,我想复制最新的标签1000并编辑并粘贴1001 <build>标签。
  • 在此标记中,有一个名为<version>的属性,我每次创建构建时都必须更新,然后在同一个文件中复制相同的新构建标记,即在<build>标记处添加abc.xml标记{1}}档案。

因此,简而言之,我必须复制最后一个记录,即1000个<build>标记,并使用最新版本在<tag>属性中进行编辑,并将其粘贴到标记为1001 <build>标记的同一文件中

<root>
  <build number="1000">
    <tag verison="xx.yy" />
  </build>
  <!-- new tag -->
  <build number="1001">
    <tag version="xx.zz" />
  </build>
</root>

这是我必须在创建构建期间手动执行的任务。所以请让我知道如何实现它,然后可以考虑将来自动化它。

1 个答案:

答案 0 :(得分:0)

由于您没有标记某种语言,我将使用perlish解决方案。 Perl拥有优秀的gsub("[]", "", p1) 库,这对于这类事情非常有用。

在这段代码中,我们为每个XML::Twig元素设置一个处理程序,它计算出最高的内部版本号,并存储对该元素的引用。一旦它处理完整个XML,我们知道我们已经看过整个事情,所以我们复制它,增加数字,然后粘贴它。

像这样:

build

打印哪些:

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

my $last_build; 
my $build_number; 

sub update_build {
    my ( $twig, $build ) = @_;
    if ( not defined $build_number 
    or $build -> att('number') > $build_number ) {
      $last_build = $build;
      $build_number = $build -> att('number'); 
    }
}

my $twig = XML::Twig -> new ( pretty_print => 'indented',
                              twig_handlers => { 'build' => \&update_build }, ) -> parse ( \*DATA );

my $new_build = $last_build -> copy;
$new_build -> set_att('number', ++$build_number );
$new_build -> paste ( after => $last_build );
$twig -> print; 

__DATA__
<root>
  <build number="1000">
    <tag verison="xx.yy" />
  </build>
  <build number="1001">
    <tag version="xx.zz" />
  </build>
</root>