2

我的输入文件是

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 并且不确定哪种方法可以有效地帮助我的解决方案。
我的请求的一个小例子将不胜感激。

*输入文件将始终按第一个字段排序

4

2 回答 2

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>';
于 2013-04-13T09:25:11.243 回答
1

Recommend is to use XML::Simple instead of writing an selfmade XML Parser. You just need to set:

use XML::Simple;
my $xml = XMLout($hashref, RootName => 'Data');
于 2013-04-13T09:39:38.130 回答