根据另一个Tag值更改PERL中XML标记的值

时间:2013-09-02 08:02:25

标签: xml perl

这是情景。

<Student_Detail>
<Name> Alexander Stephen </Name>
<Employee_id> 234567 </Employee_id>
</Student_Detail>

<Student_Detail>
<Name> Geet Sethi </Name>
<Employee_id> 264577 </Employee_id>
</Student_Detail>   

考虑以上是XML文件的一部分。我的工作是根据名称更改员工ID。

对Alexander Stephen说,新的员工ID应该是264785。

我需要通过PERL进行上述更改。但问题是它相对较新。

我的尝试是识别标签,将其存储在一个数组中,然后根据名称标签发布新的员工ID。有人可以帮助我一个初创的想法,以便我可以更好地加快代码。

1 个答案:

答案 0 :(得分:1)

使用XML :: Twig的解决方案:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

# a hash name => new_id
my %new_id= ( 'Alexander Stephen' => '264785'
            );

my $t= XML::Twig->new( twig_handlers => { Student_Detail => \&student },
                       keep_spaces => 1,
                     )
                 ->parse( \*DATA); # or parsefile( 'my_file') in the real code

# called any time a Student_Detail element has been completely parsed
sub student
  { my( $t, $student)= @_; 

    # use trimmed_field to get rid of extra spaces
    my $name= $student->trimmed_field( 'Name'); 

    if( my $new_id= $new_id{$name}) 
      { $student->first_child( 'Employee_id')->set_text( $new_id); }

    $t->flush; # outputs the XML so far
  }

__DATA__
<Students>
<Student_Detail>
<Name> Alexander Stephen </Name>
<Employee_id> 234567 </Employee_id>
</Student_Detail>

<Student_Detail>
<Name> Geet Sethi </Name>
<Employee_id> 264577 </Employee_id>
</Student_Detail>   
</Students>

这会将输出打印到STDOUT。您可以将其重定向到特定文件,或者如果要更新文件,请使用parsefile_inplace

您的XML有点奇怪,名称和ID周围的空格可能会产生问题。你确定它们存在于真实数据中吗?