Perl中的XML文件创建 - 更新要求

时间:2013-04-16 12:42:13

标签: perl xml-parsing

对不起,我发布了这个,但很多要求已经改变,我需要建议 我的第一个输入文件是

Root1      TBLA      KEY1      COLA      A    B    
Root1      TBLA      KEY1      COLB      D    E    
Root1      TBLA      KEY3      COLX      M    N     
Root2      TBLB      KEY4      COLX      M    N     
Root2      TBLB      KEY4      COLD      A    B   
Root3      TBLC      KEY5      COLD      A    B 

我的第二个输入文件是

Root1      TBLA      KEY6    
Root2      TBLB      KEY7    
Root3      TBLC      KEY8 

我的第三个输入文件是

Root1      TBLA      KEY9    
Root1      TBLA      KEY10    
Root3      TBLC      KEY11 

基本上文件表示是
1)第一个文件代表旧值和新值。首先是根表,第二个是实际的表,其中有diff。第三列告诉键值。第四和第五代表新旧价值。

2)第二个文件表示仅存在于db1中而不存在于db2中的主键。首先是根表,第二个是密钥存在的实际表。第三列告诉键值

3)第三个文件表示仅存在于db2中而不存在于db1中的主键。首先是根表,第二个是密钥存在的实际表。第三列告诉键值

以xml格式创建的输出

   <Data>    
    <Root1>
        <TBLA>    
            <NEW1>
                <KEY>KEY6</KEY>
            <NEW1>              
            <NEW2>
                <KEY>KEY9</KEY>
                <KEY>KEY10</KEY>
            <NEW2>              
            <MODIFIED>
                <KEY name =KEY1>
                    <COLA>
                        <oldvalue>A</oldvalue>
                        <newvalue>B</newvalue>    
                    </COLA> 
                    <COLB>    
                        <oldvalue>D</oldvalue>    
                        <newvalue>E</newvalue>     
                    </COLB>
                </KEY>
                <KEY name =KEY3>
                    <COLX>
                        <oldvalue>M</oldvalue>
                        <newvalue>N</newvalue>    
                    </COLX> 
                </KEY>
            </MODIFIED>     
        </TBLA>
    </Root1>        
    <Data>

这不是完整的输出。显示部分输出 任何人都可以建议什么是最好的方法来做到这一点。我应该首先将此文本文件转换为哈希哈希,然后尝试使用pltoxml()。这有道理吗XML::SimpleXML::Writer可以满足要求。

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

*输入文件将始终按Root排序,然后按TBLNAME

排序

输出格式
输出包含每个根,每个表中的每个表以及每个表的密钥,密钥存在于一个密钥中,然后密钥仅存在于第二个密钥中。这分别在new1和new2部分。第三部分包含Modified,需要从第一个输入文件读取并列出键值,并使用该键值列出哪些列被修改(它们的旧值和新值)

如果我必须使用XML :: Simple,我如何从这些文件创建hashref,我可以将它传递给XMLout。任何这些文件都没有密钥。

1 个答案:

答案 0 :(得分:1)

这只是使用split将数据拆分为字段,将其存储为哈希,然后使用XML::Simple对其进行转换的问题。

  • 请注意,我会将内容添加到数组中以强制执行您的预定订单。
  • DATA句柄读取所有数据。你不应该让我向你展示IO代码。
  • @processors数组就是您在各种文件中使用的不同处理器:

代码:

use 5.016;
use strict;
use warnings;

use XML::Simple qw(:strict);

my %roots;

my @processors 
    = ( sub {
           my ( $root, $table, $key, $col, $old, $new ) = split /\s+/;
           $roots{ $root }{ $table }[2]{MODIFIED}{ $col }
                = { oldvalue => $old 
                  , newvalue => $new 
                  };
           return;
        }
      , sub { 
          my ( $root, $table, $key ) = split /\s+/;
          push @{ $roots{ $root }{ $table }[0]{NEW1}{KEY} }, $key;
        }
      , sub { 
          my ( $root, $table, $key ) = split /\s+/;
          push @{ $roots{ $root }{ $table }[1]{NEW2}{KEY} }, $key;
        }
      );

my $processor = shift @processors;
while ( <> ) { 
    chomp;
    if ( $_ eq '---' ) { 
        $processor = shift @processors;
    }
    else {
        $processor->( $_ );
    }
}

my $xs = XML::Simple->new( NoAttr => 1, RootName => 'Data', );
my $xml = $xs->XMLout( \%roots, KeyAttr => {} );
say $xml;

它产生:

<Data>
  <Root1>
    <TBLA>
      <NEW1>
        <KEY>KEY6</KEY>
      </NEW1>
    </TBLA>
    <TBLA>
      <NEW2>
        <KEY>KEY9</KEY>
        <KEY>KEY10</KEY>
      </NEW2>
    </TBLA>
    <TBLA>
      <MODIFIED>
        <COLA>
          <newvalue>B</newvalue>
          <oldvalue>A</oldvalue>
        </COLA>
        <COLB>
          <newvalue>E</newvalue>
          <oldvalue>D</oldvalue>
        </COLB>
        <COLX>
          <newvalue>N</newvalue>
          <oldvalue>M</oldvalue>
        </COLX>
      </MODIFIED>
    </TBLA>
  </Root1>
  <Root2>
    <TBLB>
      <NEW1>
        <KEY>KEY7</KEY>
      </NEW1>
    </TBLB>
    <TBLB></TBLB>
    <TBLB>
      <MODIFIED>
        <COLD>
          <newvalue>B</newvalue>
          <oldvalue>A</oldvalue>
        </COLD>
        <COLX>
          <newvalue>N</newvalue>
          <oldvalue>M</oldvalue>
        </COLX>
      </MODIFIED>
    </TBLB>
  </Root2>
  <Root3>
    <TBLC>
      <NEW1>
        <KEY>KEY8</KEY>
      </NEW1>
    </TBLC>
    <TBLC>
      <NEW2>
        <KEY>KEY11</KEY>
      </NEW2>
    </TBLC>
    <TBLC>
      <MODIFIED>
        <COLD>
          <newvalue>B</newvalue>
          <oldvalue>A</oldvalue>
        </COLD>
      </MODIFIED>
    </TBLC>
  </Root3>
</Data>