죄송합니다. 어리석은 질문을하고 있을지 모르지만 Perl이나 awk (shell programming)에 대해서는 그다지 익숙하지 않습니다.
내 요구 사항은 일부 조건에 따라 XML을 필터링하는 것입니다.
참고로 더미 XML을 제공하고 있습니다.
<TRADEEXT>
<TRADE origin = "AB" ref = "1" version = "1"/>
<TRADE origin = "AB" ref = "1" version = "2"/>
<TRADE origin = "ABC" ref = "1" version = "1"/>
</TRADEEXT>
이제 필터 조건은 다음과 같습니다.
출발지 = "AB"인 TRADES 만 선택해야합니다.
첫 번째 조건을 적용한 후 ref (group by ref)를 기반으로 가장 높은 버전을 가진 TRADES 만 선택하십시오.
따라서 필터링 된 TRADES가있는 결과 XML은 다음과 같아야합니다.
<TRADEEXT>
<TRADE origin = "AB" ref = "1" version = "2"/>
</TRADEEXT>
아래 코드에서 언급 한대로 출처가 "AB"인 TRADES를 필터링했습니다. 그러나 주어진 심판에 대해 가장 높은 버전을 기반으로 TRADES를 필터링 할 수 없습니다.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $twig = new XML::Twig( twig_handlers => { TRADE => \&TRADE } );
$twig->parsefile('1513.xml');
$twig->set_pretty_print('indented');
$twig->print_to_file('out.xml');
sub TRADE {
my ($twig, $TRADE) = @_;
foreach my $c ($TRADE) {
$c->cut($TRADE) unless $c->att('origin') eq "AB";
}
}
어떤 힌트라도 대단히 감사하겠습니다.
이를 수행하는 가장 명확한 방법은 XML 데이터를 두 번 통과하는 것입니다. 첫 번째 version
는 각에 대한 최대 값을 찾는 ref
것이고 두 번째는 최대 값보다 낮은 버전을 가진 요소를 제거하는 것입니다.
이 프로그램은 사용하는 TRADE
해시 구축 나뭇 가지 핸들러를 %max_version
당 최대 버전을 ref
. 데이터 구문 분석에는 전혀 영향을주지 않습니다.
그런 다음 for
루프 TRADE
는 루트 요소 의 모든 하위 항목을 검색하여을 TRADEEXT
사용 delete
하여 최대 버전 이외의 버전을 가진 모든 항목을 제거합니다.
use strict;
use warnings;
use XML::Twig 3.48;
my $twig = new XML::Twig(
twig_handlers => { '/TRADEEXT/TRADE' => \&trade_handler },
att_accessors => [ qw/ origin ref version / ],
pretty_print => 'indented',
);
my %max_version;
$twig->parsefile('1513.xml');
for my $trade ($twig->root->children('TRADE')) {
my ($ref, $version) = ($trade->ref, $trade->version);
$trade->delete unless $version eq $max_version{$ref};
}
$twig->print_to_file('out.xml');
sub trade_handler {
my ($twig, $trade) = @_;
if ( $trade->origin eq 'AB' ) {
my ($ref, $version) = ($trade->ref, $trade->version);
unless (exists $max_version{$ref} and $max_version{$ref} >= $version) {
$max_version{$ref} = $version;
}
}
1;
}
산출
<TRADEEXT>
<TRADE origin="AB" ref="1" version="2"/>
</TRADEEXT>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다