我需要将所有xml id存储的哈希作为键,值始终为空。如何在twig中收集全局哈希值中的所有id值。
的xml:
xml:
<book>
<book-meta>
<p><xref id="page_xii"/> to reproduce their work<xref id="fn1"/> in this volume<xref id="fn2"/>.</p>
</book-meta>
</book>
脚本:
use strict;
use XML::Twig;
my $xml_twig_content = XML::Twig->new(
keep_encoding => 1,
twig_handlers => {
keep_atts_order => 1,
},
pretty_print => 'indented',
);
$xml_twig_content->parsefile('sample.xml');
我无法做到这一点,我怎样才能将所有id作为全局哈希作为键。
我需要:
my %global;
我怎样才能得到这个。存储此类型的示例,$ global {page_xii} ='';
答案 0 :(得分:2)
这取决于你是否需要按顺序,在数组中,或者在哈希中使用tham。
要将它们放入哈希值,没有太多事情可做,它们位于$twig->{twig_id_list}
中(为什么你称之为$xml_twig_content
?它很长而且很麻烦)。 API没有保证这一点,但它在10年内没有改变,我认为没有理由在未来10年内改变它。
要将它们放入数组中,您可以在@*[@id]
上设置一个处理程序,将id转入数组:
twig_handlers => { '*[@id]' => sub { push @ids, $_->id; } }
然后,如果你想要的是一个哈希id =&gt; ,做
my %global= map { $_ => $ids[$_] } 1..@ids;
虽然这是一种奇怪的要求。
答案 1 :(得分:1)
您可以为_all_
元素添加处理程序,只需解析每个元素的id
。有关更多信息,请参阅docs。您可能需要稍微搜索一下。
use strict;
use warnings;
use XML::Twig;
my $xml = <<'XML';
<book>
<book-meta>
<p><xref id="page_xii"/> to reproduce their work<xref id="fn1"/> in this volume<xref id="fn2"/>.</p>
</book-meta>
</book>
XML
my %global;
my $xml_twig_content = XML::Twig->new(
keep_encoding => 1,
twig_handlers => {
keep_atts_order => 1,
'_all_' => sub { # this is the important part!
my ( $twig, $elem ) = @_; # second argument is the current element
$global{ $elem->id } = ''; # it has a method id() that gets the id
},
},
pretty_print => 'indented',
);
$xml_twig_content->parse($xml);
print Dumper \%global;
更一般地说,您应该在程序中添加use warnings
。此外,您通常不只是将%global
中的元素值设置为''
,而是使用增量代替:
$global{ $elem->id }++;