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

tham が順番に必要か、配列で必要か、必要でないか、ハッシュであるかによって異なります。

それらをハッシュに入れるために、やることはあまりありませ$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 に答える