XML::Twigを学び、XMLドキュメントからデータを取得しようとしています。XML :: Twigを使用して不要な要素をスキップする方法は?
私のXMLには20k + <ADN>
要素が含まれています。 Eaach <ADN>
要素には数十の子要素が含まれ、そのうちの1つは<GID>
です。
ハンドラは、一定の順序でトリガーされ、そのタイプによってソート(XPathの :私は
GID
== 1(たとえば、XMLが__DATA__
ある参照)は、ドキュメントは言うのみ
ADN
プロセスをしたいです最初に正規表現、次に正規表現、次にレベル)、次に (ルート要素で始まる)フルパスを指定するかどうかによって、 式のステップ数、述部の数、次に のテスト数述語。最後のステップがないハンドラ ステップ(foo/bar/*)が他のXPathハンドラの後にトリガされます。 最後にすべてハンドラが最後にトリガされます。重要:それはとにかく と呼ばれるすべてハンドラを除き、何らの 他のハンドラが呼び出されていない0を返した場合、ハンドラがトリガされた後。
私の実際のコード:そう
$VAR1 = {
'1000' => {
'ID' => '1000',
'Name' => 'other name 1000'
},
'1' => {
'Name' => 'name 1',
'ID' => '1'
},
'20' => {
'Name' => 'should be skipped because GID != 1',
'ID' => '20'
}
};
出力
use 5.014;
use warnings;
use XML::Twig;
use Data::Dumper;
my $cat = load_xml_catalog();
say Dumper $cat;
sub load_xml_catalog {
my $hr;
my $current;
my $twig= XML::Twig->new(
twig_roots => {
ADN => sub { # process the <ADN> elements
$_->purge; # and purge when finishes with one
},
},
twig_handlers => {
'ADN/GID' => sub {
return 1 if $_->trimmed_text == 1;
return 0; # skip the other handlers - if the GID != 1
},
'ADN/ID' => sub { #remember the ID as a "key" into the '$hr' for the "current" ADN
$current = $_->trimmed_text;
$hr->{$current}{$_->tag} = $_->trimmed_text;
},
#rules for the wanted data extracting & storing to $hr->{$current}
'ADN/Name' => sub {
$hr->{$current}{$_->tag} = $_->text;
},
},
);
$twig->parse(\*DATA);
return $hr;
}
__DATA__
<ArrayOfADN>
<ADN>
<GID>1</GID>
<ID>1</ID>
<Name>name 1</Name>
</ADN>
<ADN>
<GID>2</GID>
<ID>20</ID>
<Name>should be skipped because GID != 1</Name>
</ADN>
<ADN>
<GID>1</GID>
<ID>1000</ID>
<Name>other name 1000</Name>
</ADN>
</ArrayOfADN>
、
ADN/GID
戻り0
GID = 1 のハンドラ!
- 他のハンドラがまだ呼び出されているのはなぜですか?
- 期待される出力には
'20' => ...
が含まれていません。 - 不要なノードを正しくスキップするにはどうすればよいですか?
@toolicをドキュメントによると、_Handlersが固定order_でトリガされているので、おそらく私は順序が決定される方法を理解していません - aka、上記を解決する方法...;) – cajwine
問題は、ハンドヘーダーが特定の要素に対して一定の順序でトリガーすることです。彼らはそれぞれ別のものにリセットします。 – Sobrique