주어진 조건에 따라 XML을 필터링 할 수 없습니다.

카란 아 로라

죄송합니다. 어리석은 질문을하고 있을지 모르지만 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>

이제 필터 조건은 다음과 같습니다.

  1. 출발지 = "AB"인 TRADES 만 선택해야합니다.

  2. 첫 번째 조건을 적용한 후 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

SQL-입력 한 순서에 따라 항목을 어떻게 필터링 할 수 있습니까?

분류에서Dev

항목이 튜플 인 행의 마스크에 따라 열을 어떻게 필터링 할 수 있습니까?

분류에서Dev

조건에 따라 객체 배열을 어떻게 필터링합니까?

분류에서Dev

Java에서 주어진 조건에 따라 문자열을 분할하는 방법은 무엇입니까?

분류에서Dev

주기없이 R의 주어진 조건에 따라 참 또는 거짓을 채우는 벡터

분류에서Dev

주어진 값에 따라 OIC 커넥터를 어떻게 전환 할 수 있습니까?

분류에서Dev

두 가지 조건에 따라 동일한 테이블을 두 번 조인 할 수 없습니다.

분류에서Dev

SQL Server의 다른 열 조건에 따라 열에서 고유 한 행을 검색 할 수 없습니다.

분류에서Dev

userRole에서 노트북을 필터링 할 수 없습니다.

분류에서Dev

필요에 따라 preg_match_all을 에코 할 수 없습니다.

분류에서Dev

Pandas : 다른 열의 조건에 따라 셀 값을 설정할 수 없습니다.

분류에서Dev

그에 따라 문자열을 분할 할 수 없습니다.

분류에서Dev

이전 행에 따라 Python에서 출력을 필터링 할 수 있습니까?

분류에서Dev

객체 배열이 주어진 경우 배열의 각 일치 항목에 따라 데이터베이스에있는 기존 객체의 결과를 어떻게 필터링 할 수 있습니까?

분류에서Dev

조건에 따라 개체 배열에 <th>를 추가 할 수 없습니다.

분류에서Dev

파이썬의 조건에 따라 여러 데이터 프레임 열의 데이터 유형을 어떻게 변경할 수 있습니까?

분류에서Dev

조건에 따라 쿼리에서 if else 조건을 사용할 때 PHP CODEIGNITER의 뷰에서 해당 값을 어떻게 얻을 수 있습니까?

분류에서Dev

열 항목을 기반으로 특정 조건에 따라 Pandas 열 데이터를 어떻게 변경할 수 있습니까?

분류에서Dev

Cypher로 지정된 다중 반복에 대한 관계 조건을 어떻게 필터링 할 수 있습니까?

분류에서Dev

Java '클래스의 생성자는 주어진 유형에 적용 할 수 없습니다.' '필수 : 인수를 찾을 수 없음 : 문자열'

분류에서Dev

파이썬은 주어진 조건에서 단어를 인쇄 할 수 없습니다

분류에서Dev

조건자가 Result <bool, _>을 반환 할 때 반복기를 어떻게 필터링 할 수 있습니까?

분류에서Dev

Cypher는 주어진 유형에서 처음 발견 된 노드의 속성을 기반으로 결과를 필터링 할 수 있습니까?

분류에서Dev

Pandas의 다른 데이터 프레임에있는 열에 주어진 조건에 따라 데이터 프레임의 열에 대한 작업을 수행합니다.

분류에서Dev

React.js에서 내 배열을 통해 필터링 할 수 없습니다.

분류에서Dev

Arrow 테이블에서 생성 된 DataFrame을 필터링 할 수 없습니다.

분류에서Dev

사용자 서비스에 대한 journalctl을 필터링 할 수 없습니다.

분류에서Dev

주어진 조건에 따라 텍스트 보고서를 필터링하고 원하는 값을 출력하는 스크립트 작성

분류에서Dev

Google 시트에서 어떻게 할 수 있습니까? 조건에 따라 곱하다

Related 관련 기사

  1. 1

    SQL-입력 한 순서에 따라 항목을 어떻게 필터링 할 수 있습니까?

  2. 2

    항목이 튜플 인 행의 마스크에 따라 열을 어떻게 필터링 할 수 있습니까?

  3. 3

    조건에 따라 객체 배열을 어떻게 필터링합니까?

  4. 4

    Java에서 주어진 조건에 따라 문자열을 분할하는 방법은 무엇입니까?

  5. 5

    주기없이 R의 주어진 조건에 따라 참 또는 거짓을 채우는 벡터

  6. 6

    주어진 값에 따라 OIC 커넥터를 어떻게 전환 할 수 있습니까?

  7. 7

    두 가지 조건에 따라 동일한 테이블을 두 번 조인 할 수 없습니다.

  8. 8

    SQL Server의 다른 열 조건에 따라 열에서 고유 한 행을 검색 할 수 없습니다.

  9. 9

    userRole에서 노트북을 필터링 할 수 없습니다.

  10. 10

    필요에 따라 preg_match_all을 에코 할 수 없습니다.

  11. 11

    Pandas : 다른 열의 조건에 따라 셀 값을 설정할 수 없습니다.

  12. 12

    그에 따라 문자열을 분할 할 수 없습니다.

  13. 13

    이전 행에 따라 Python에서 출력을 필터링 할 수 있습니까?

  14. 14

    객체 배열이 주어진 경우 배열의 각 일치 항목에 따라 데이터베이스에있는 기존 객체의 결과를 어떻게 필터링 할 수 있습니까?

  15. 15

    조건에 따라 개체 배열에 <th>를 추가 할 수 없습니다.

  16. 16

    파이썬의 조건에 따라 여러 데이터 프레임 열의 데이터 유형을 어떻게 변경할 수 있습니까?

  17. 17

    조건에 따라 쿼리에서 if else 조건을 사용할 때 PHP CODEIGNITER의 뷰에서 해당 값을 어떻게 얻을 수 있습니까?

  18. 18

    열 항목을 기반으로 특정 조건에 따라 Pandas 열 데이터를 어떻게 변경할 수 있습니까?

  19. 19

    Cypher로 지정된 다중 반복에 대한 관계 조건을 어떻게 필터링 할 수 있습니까?

  20. 20

    Java '클래스의 생성자는 주어진 유형에 적용 할 수 없습니다.' '필수 : 인수를 찾을 수 없음 : 문자열'

  21. 21

    파이썬은 주어진 조건에서 단어를 인쇄 할 수 없습니다

  22. 22

    조건자가 Result <bool, _>을 반환 할 때 반복기를 어떻게 필터링 할 수 있습니까?

  23. 23

    Cypher는 주어진 유형에서 처음 발견 된 노드의 속성을 기반으로 결과를 필터링 할 수 있습니까?

  24. 24

    Pandas의 다른 데이터 프레임에있는 열에 주어진 조건에 따라 데이터 프레임의 열에 대한 작업을 수행합니다.

  25. 25

    React.js에서 내 배열을 통해 필터링 할 수 없습니다.

  26. 26

    Arrow 테이블에서 생성 된 DataFrame을 필터링 할 수 없습니다.

  27. 27

    사용자 서비스에 대한 journalctl을 필터링 할 수 없습니다.

  28. 28

    주어진 조건에 따라 텍스트 보고서를 필터링하고 원하는 값을 출력하는 스크립트 작성

  29. 29

    Google 시트에서 어떻게 할 수 있습니까? 조건에 따라 곱하다

뜨겁다태그

보관