2013-04-16 2 views
2

안녕하세요, 저는 XML을 가지고 있으며 그 안에있는 태그 값을 기반으로 여러 XML로 분할하려고합니다.태그 값을 기준으로 XML을 분할하십시오.

예 - 상기 실시 예에서

<HEADER> 
<ROOT> 
<TAG1>ABC</TAG1> 
<TAG2>78011DAC8</TAG2> 
<TAG3>US78011DAC83</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>ABC</TAG1> 
<TAG2>78011DAD6</TAG2> 
<TAG3>US78011DAD66</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>ABC</TAG1> 
<TAG2>B06983611</TAG2> 
<TAG3>GB0009075325</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>ABC</TAG1> 
<TAG2>B06983629</TAG2> 
<TAG3>GB0009081828</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>ABC</TAG1> 
<TAG2>BRS038D62</TAG2> 
<TAG3>FR0010050559</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>ABC</TAG1> 
<TAG2>BRS49ESZ5</TAG2> 
<TAG3>GB00B1Z5HQ14</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>B06983637</TAG2> 
<TAG3>GB0008983024</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>BRS26Y2R4</TAG2> 
<TAG3>GB00B128DH60</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>BRS1JW2X3</TAG2> 
<TAG3>FR0010235176</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>BRS1JW2Y1</TAG2> 
<TAG3>GB00B0CNHZ09</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>BRS3BP9P2</TAG2> 
<TAG3>GB00B1L6W962</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>BRS7FFAV6</TAG2> 
<TAG3>GB00B3D4VD98</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>B0A07E1X7</TAG2> 
<TAG3>GB0031790826</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>DEF</TAG1> 
<TAG2>BRS1Z0T57</TAG2> 
<TAG3>GB00B0V3WQ75</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>XYZ</TAG1> 
<TAG2>BRS9ZDYJ6</TAG2> 
<TAG3>FR0010899765</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>XYZ</TAG1> 
<TAG2>BRS8ANE14</TAG2> 
<TAG3>DE0001030526</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>XYZ</TAG1> 
<TAG2>BRS22TXL8</TAG2> 
<TAG3>DE0001030500</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>XYZ</TAG1> 
<TAG2>BRS5LHPB7</TAG2> 
<TAG3>GB00B24FFM16</TAG3> 
</ROOT> 
<ROOT> 
<TAG1>XYZ</TAG1> 
<TAG2>B06983223</TAG2> 
<TAG3>GB0008932666</TAG3> 
</ROOT> 
</HEADER> 

난 TAG1 값을 확인해야하고, 다음 TAG1 값과 일치하는 경우는 분할하지 않아야하고 있지 일치하는 않는 경우가로 분할해야 새로운 XML 파일 ...

감사합니다.

+1

[당신이 시도 무엇?] (HTTP ://mattgemmell.com/2008/12/08/what-have-you-tried/) – Demnogonis

답변

0

어쩌면 당신은 내가 실제로 outcoming의 XML을 struc 여기

+0

출력은 TAG1 값을 기준으로 여러 xml로 분할되어야합니다. TAG1 값은 처음 6 개 레코드의 ABC입니다.이 6 개 레코드는 Part1이나 확장자가있는 새 XML 파일 이름으로 쓰여 져야합니다. TAG1 값은 다음 8 개의 레코드에서 다르기 때문에 8 개의 레코드가 xml 파일 이름 part2에 wrtitten되어야합니다. – Srini

2

이다를 사용하여이 작업을 수행하는 비교적 간단한 방법을 잘 모릅니다

if ($xml->{HEADER}->[0]->{ROOT}->{TAG1} == $xml->{HEADER}->[1]->{ROOT}->{TAG1}) { ... } 

처럼 다음

use XML::Simple; 

my $xml = XMLin($your_xml); 

과 뭔가를 구문 분석 할 수 XML :: 나뭇 가지. 메모리에 유지되는 최대 크기는 전체 하위 파일이므로 중요 할 수도 있습니다 (메모리에 1 ROOT을 유지하는 것이 더 좋을 수 있습니다).

#!/usr/bin/perl 

use strict; 
use warnings; 

use autodie qw(open); 

use XML::Twig; 

my $in_file = $ARGV[0]; 

my $out_file= "$in_file.p"; 
my $i="01"; 
my $current_tag1=''; 


my $twig=XML::Twig->new( 
    twig_handlers => { 
     ROOT => sub { my($t, $root)= @_; 
        $current_tag1||= $root->field('TAG1');  # initialize current tag if needed 

        if($root->field('TAG1') ne $current_tag1) # found a break in the value of TAG1 
         { 
         $root->cut;        # get the new root out of the way 
         $t->print_to_file($out_file. $i++);  # output the part 
         $t->purge;        # remove the content of the part 
         $root->paste(first_child => $t->root); # put the new root back in place 

         $current_tag1= $root->field('TAG1'); 
         } 
        } 
    }, 
    keep_spaces => 1, # to keep line returns 
); 

$twig->parsefile($in_file); 
$twig->print_to_file($out_file . $i); # output the last part 
+0

감사합니다 mirod ..이 스크립트는 TAG1 값을 기반으로 파일을 분할 할 수 있지만 XML 파일을 몇 가지 레코드 수 (예 : 3) 기반으로 분할하고 즉각적인 레코드 TAG1 값을 확인한 다음 일치하지 않으면 중단합니다. 레코드 수는 3이지만, 대신 동일한 TAG1 값을 찾지 못한 후에 만 ​​멈 춥니 다. 예제에서 TAG1 값은 첫 번째 5 레코드의 ABC이므로 첫 번째 part1 xml 파일에는 5 개의 레코드가 있어야합니다 (count를 확인하더라도 of 3 records) .... – Srini

+0

파일의 분할은 핸들러의 if 블록 내에서 수행됩니다. 이것은 변경되지 않습니다. 분할을 시작하려면 적절한 조건을 찾아야합니다. 각 ROOT 요소에 대해 증가 된 카운터를 추가하고 분할 할 때 다시 설정하면 올바른 조건이 현재 AND'$ counter'> $ MIN_ROOT_IN_FILE이됩니다. 당신은 이미 그 길의 80 %에요, 용기! – mirod

+0

mirod 업데이트 주셔서 감사합니다. 여기서 문제는 if 루프에 있습니다. 최대 또는 최소 레코드 값에 도달 한 후 값을 재설정 할 수 없습니다 ... TAG1 값 확인과 함께이 조건을 추가하는 데 도움이 될 수 있습니다 ... 감사합니다 ... – Srini

2

Atlast 내가 .... 수정 .. 아래 는 모두 수와 TAG 값을 확인합니다 코드입니다 발견

#!/usr/bin/perl 

use strict; 
use warnings; 

use autodie qw(open); 

use XML::Twig; 

my $in_file = $ARGV[0]; 

my $out_file= "$in_file.p"; 
my $i="01"; 
my $current_tag1=''; 
my $previous_tag1 = ''; 
my $nb_root_in_file =0; 
my $MIN_ROOT_IN_FILE = 5; 


my $twig=XML::Twig->new( 
twig_handlers => { 
    ROOT => sub { my($t, $root)= @_; 
    $current_tag1||= $root->field('TAG1');  # initialize current tag if needed 
    $nb_root_in_file++; 
    if($nb_root_in_file > $MIN_ROOT_IN_FILE && $root->field('TAG1') ne $current_tag1) # found a break in the value of TAG1 
        { 
        $root->cut;     # get the new root out of the way 
        $t->print_to_file($out_file. $i++);  # output the part 
        $t->purge;      # remove the content of the part 
       $root->paste(first_child => $t->root); # put the new root back in place 
        $current_tag1= $root->field('TAG1'); 
        $nb_root_in_file =0; 
        } 
        $previous_tag1 = $current_tag1; 
       } 
}, 
keep_spaces => 1, # to keep line returns 
); 

$twig->parsefile($in_file); 
    $twig->print_to_file($out_file . $i); # output the last part 
관련 문제