xml - 查找单个标签内n个相同的内部标签内容

标签 xml regex perl

如何获取单个标签内呈现的相同标签的内部标签内容值,不带换行符

<BOOK-REF ID="Kyle-ch001-bib036"><AUTHOR-REF><SURNAME>Neinstein</SURNAME>, <GIVEN-NAME>L. S.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Gordon</SURNAME>, <GIVEN-NAME>C. G.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Katzman</SURNAME>, <GIVEN-NAME>D.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Rosen</SURNAME>, <GIVEN-NAME>D.</GIVEN-NAME></AUTHOR-REF>, &#x0026; <AUTHOR-REF><SURNAME>Woods</SURNAME>, <GIVEN-NAME>E.</GIVEN-NAME></AUTHOR-REF> (<YEAR-REF>2007</YEAR-REF>). <BOOK-TITLE-REF>Adolescent health care: A practical guide</BOOK-TITLE-REF> (<EDITION-REF>5th ed.</EDITION-REF>). <PLACE-OF-PUBLICATION-REF>Philadelphia</PLACE-OF-PUBLICATION-REF>: <PUBLISHER-REF>Lippincott Williams and Wilkins</PUBLISHER-REF>.</BOOK-REF>

我只想获取名称标签内的内容(单独的名称)以及图书引用标签内的内容,姓氏标签可能会出现n次,我想要数组中的内容

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

提前致谢

最佳答案

使用 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__
<books>
<BOOK-REF ID="Kyle-ch001-bib036"><AUTHOR-REF><SURNAME>Neinstein</SURNAME>, <GIVEN-NAME>L. S.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Gordon</SURNAME>, <GIVEN-NAME>C. G.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Katzman</SURNAME>, <GIVEN-NAME>D.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Rosen</SURNAME>, <GIVEN-NAME>D.</GIVEN-NAME></AUTHOR-REF>, &#x0026; <AUTHOR-REF><SURNAME>Woods</SURNAME>, <GIVEN-NAME>E.</GIVEN-NAME></AUTHOR-REF> (<YEAR-REF>2007</YEAR-REF>). <BOOK-TITLE-REF>Adolescent health care: A practical guide</BOOK-TITLE-REF> (<EDITION-REF>5th ed.</EDITION-REF>). <PLACE-OF-PUBLICATION-REF>Philadelphia</PLACE-OF-PUBLICATION-REF>: <PUBLISHER-REF>Lippincott Williams and Wilkins</PUBLISHER-REF>.</BOOK-REF>
</books>

关于xml - 查找单个标签内n个相同的内部标签内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9159849/

相关文章:

java - 如果值包含 3 个以逗号分隔的字符串,如何检查 EditText 中的值?

android - XML-drawable 使用图层列表无法正常工作

xml - 多语言站点地图给出验证错误 "No matching global element declaration available"

c++ - 如何使用 RapidXML C++ 检查 xml 中的空标记

PHP:从字符串中获取 URL 的正则表达式

javascript - 如何使用正则表达式将字符串替换为自身?

perl - 如何在 Unix/Linux 上使用 perl 执行批量 DNS 查询?

perl - perl 如何从模块中导入子程序

Java模式匹配器查找多个字符串

linux - 检查程序是否存在