Perl中的XML文件创建

时间:2013-04-13 08:48:29

标签: perl xml-parsing

我的输入文件是

TBLA      COLA      A    B    
TBLA      COLB      D    E    
TBLB      COLX      M    N     
TBLB      COLD      A    B   
TBLC      COLD      A    B 

以xml格式创建的输出

<Data>    
    <TBLA>    
        <COLA>
            <oldvalue>A</oldvalue>
            <newvalue>B</newvalue>    
        </COLA>         
        <COLB>    
            <oldvalue>D</oldvalue>    
            <newvalue>E</newvalue>     
        </COLB>       
    </TBLA>    
    <TBLB>     
        <COLX>    
            <oldvalue>M</oldvalue>    
            <newvalue>N</newvalue>    
        </COLX>       
        <COLD>    
            <oldvalue>A</oldvalue>   
            <newvalue>B</newvalue>     
        </COLD>       
    </TBLB>     
    <TBLC>    
        <COLD>    
            <oldvalue>A</oldvalue>    
            <newvalue>B</newvalue>     
        </COLD>   
    </TBLC>  
</Data>     

任何人都可以建议最好的方法。我应该首先将此文本文件转换为哈希哈希,然后尝试使用pltoxml()。这有道理吗XML::SimpleXML::Writer可以满足要求。

这是我第一次使用xml而不确定哪种方法可以有效地帮助我解决问题 我的req的一个小例子将不胜感激。

*输入文件将始终在第一个字段

上排序

2 个答案:

答案 0 :(得分:2)

鉴于非常简单的数据结构,使用整个XML编写器似乎有点不必要。但是,我假设表名和列名是有效的XML标记名。

这是一个简单的脚本,可以读取数据而不将其存储在中间数据结构中。它适用于perl5 v10和更好。

use strict; use warnings; use feature 'say';

my $last_table;
say '<Data>';
while(<>) {
  chomp;
  my ($table, $col, $old, $new) = split /\t/;
  s/&/&amp;/g, s/</&lt;/g for $old, $new;
  # I'll assume $table and $col have sane names
  if (not defined $last_table) {
    say "  <$table>";
  } elsif ($last_table ne $table) {
    say "  </$last_table>";
    say "  <$table>";
  }
  $last_table = $table;
  say "    <$col>";
  say "      <oldvalue>$old</oldvalue>";
  say "      <newvalue>$new</newvalue>";
  say "    </$col>";
}
say "  </$last_table> if defined $last_table;
say '</Data>';

答案 1 :(得分:1)

建议使用XML::Simple而不是编写自制的XML Parser。你只需要设置:

use XML::Simple;
my $xml = XMLout($hashref, RootName => 'Data');