将id全局哈希存储为键

时间:2012-11-16 12:47:15

标签: perl xml-twig

我需要将所有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;
  1. page_xii
  2. fn1的
  3. fn2的
  4. 我怎样才能得到这个。存储此类型的示例,$ global {page_xii} ='';

2 个答案:

答案 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 }++;