1つのタグの中でn個の同じ内部タグコンテンツを見つける

改行文字なしで1つのタグ内に表示された同じタグの内部タグの内容値を取得する方法

Neinstein, L. S., Gordon, C. G., Katzman, D., Rosen, D., & Woods, E. (2007). Adolescent health care: A practical guide (5th ed.). Philadelphia: Lippincott Williams and Wilkins.

私はちょうどthenametagの中に内容(名前だけ)を取得したいと思うし、本refタグ内に提示して、姓タグがn回出現するかもしれないし、コンテンツを配列に入れたい

my (@arr2);
while ($str =~ /(?:[^\)]*)(.*?)<\/SURNAME>.*?(\d+\w+)<\/YEAR-REF>.*?<\/BOOK-REF>/sgi){
    my $id = $1;
    my $sname = $2;
    my $year = $3;
    push (@arr2,[$id,$sname,$year]);
}

前もって感謝します

2

3 答え

XML :: Twigを使ってファイル内に複数のファイルが存在する場合に備えて、ブックリファレンスの周りにラッパー books を追加しました。コードはそれなしで全く同じように動作します。

#!/usr/bin/perl

use strict;
use warnings;

use YAML;
use XML::Twig;

my @by_name;
XML::Twig->new( twig_handlers => { 'BOOK-REF' => sub { book_ref( @_, \@by_name); } })
         -> parse( \*DATA);

print Dump \@by_name;

sub book_ref
  { my( $t, $bookref, $by_name)= @_;
    foreach my $surname ($bookref->descendants( 'SURNAME'))
      { push @$by_name, { name => $surname->text, id => $bookref->att( 'ID'), year =>  $bookref->field( 'YEAR-REF') }; }
    $t->purge; # if the file can be too big to fit in memory
  }



__DATA__

Neinstein, L. S., Gordon, C. G., Katzman, D., Rosen, D., & Woods, E. (2007). Adolescent health care: A practical guide (5th ed.). Philadelphia: Lippincott Williams and Wilkins.

2
追加された

xml :: XSH2 を使用する

#!/usr/bin/perl

use warnings;
use strict;

use Data::Dumper;

use XML::XSH2;
xsh << '    end xsh;';
    open 1.xml ;
    for //SURNAME {
        $y = string(../../YEAR-REF) ;
        $s = string(.) ;
        $i = string(ancestor::BOOK-REF/@ID) ;
        perl { push @arr, [$i, $s, $y] } }
    end xsh;
print Dumper \@XML::XSH2::Map::arr;
1
追加された

XPathクエリを使用して、興味のある値を抽出します。これらの3つのXPathクエリは、探している値を返します。

//BOOK-REF/@ID
//BOOK-REF/AUTHOR-REF/SURNAME
//BOOK-REF/YEAR-REF

XPathクエリを実行するには、 xml :: LibXML のようなものを使用します。完全な例:

#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;

my $xml = XML::LibXML->load_xml(string => q{<?xml version="1.0" encoding="utf-8"?>
Neinstein, L. S., Gordon, C. G., Katzman, D., Rosen, D., & Woods, E. (2007). Adolescent health care: A practical guide (5th ed.). Philadelphia: Lippincott Williams and Wilkins.
});

my $xc = XML::LibXML::XPathContext->new($xml);

my $id = $xc->find('//BOOK-REF/@ID');
my @snames = map $_->textContent => $xc->findnodes('//BOOK-REF/AUTHOR-REF/SURNAME');
my $year = $xc->find('//BOOK-REF/YEAR-REF');

print "$id\n";
print join(', ' => @snames), "\n";
print "$year\n";

# prints:
# Kyle-ch001-bib036
# Neinstein, Gordon, Katzman, Rosen, Woods
# 2007

結果を次のような配列にうまく保存することができます:

push @some_array, +{
    id     => $id,
    snames => \@snames,
    year   => $year
};

元のスキームに従い、各snameのIDと年を複製する場合は、次のようになります。

push @arr2, map [ $id, $_, $year ] => @snames;

それらを格納するもう1つの潜在的に有用な方法は、idフィールドの上にキー入力されたハッシュになります。

$some_hash{$id} = +{
    id     => $id,
    snames => \@snames,
    year   => $year
};
0
追加された