0

我需要所有 xml id 存储的哈希作为键,值始终为空。如何收集存储在树枝中全局哈希中的所有 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

我怎么能得到这个。存储此类型的示例,$global{page_xii} = '';

4

2 回答 2

2

这取决于您是否需要按顺序排列,在数组中,或者在哈希中。

要将它们放入哈希中,没有什么可做的,它们就在里面$twig->{twig_id_list}(你为什么叫树枝$xml_twig_content?它又长又麻烦)。API 无法保证这一点,但它在 10 多年中没有改变,我认为在接下来的 10 年里没有理由改变它。

要将它们放入数组中,您可以设置一个处理程序@*[@id],将 id 推送到数组中:

twig_handlers => { '*[@id]' => sub { push @ids, $_->id; } }

然后,如果您想要的是哈希 id => ,请执行

my %global= map { $_ => $ids[$_] } 1..@ids;

虽然这是一个奇怪的要求。

于 2012-11-16T14:19:11.980 回答
1

您可以为元素添加一个处理程序,像这样_all_解析出id每个元素。有关更多信息,请参阅文档。你可能需要在里面搜索一下。

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 }++;
于 2012-11-16T13:30:42.843 回答