我的输入文件是
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::Simple
或XML::Writer
可以满足要求。
这是我第一次使用xml而不确定哪种方法可以有效地帮助我解决问题 我的req的一个小例子将不胜感激。
*输入文件将始终在第一个字段
上排序答案 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/&/&/g, s/</</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');