いつもお世話になっております。Perl初心者です。
以下のサイトを参考に、XML::Parser::PerlSAX を使用して、XMLファイルをフィルタリングするプログラムを作成しようと考えています。
http://mkweb.bcgsc.ca/intranet/perlbook/pxml/ch0 …
ここで、ある要素のある属性の、異なる属性値ごとに、文字データイベントを処理する方法を変えたいのですが、どのようにすればよいでしょうか。
各種SAXイベントハンドラも、XML::Handler::Subs も考えましたが、何を使えばよいか検討がつきません。よろしくお願いします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
適当。
表示がくずれるので空白2文字を全角空白にしていることに注意。use strict;
use warnings;
use feature 'say';
use XML::SAX;
my $xml = << "END";
<?xml version="1.0" encoding="utf-8" ?>
<pets>
<pet>
<type>dog</type>
<name pos="1">Yamada</name>
<name pos="2">Taro</name>
<age>3.5</age>
</pet>
<pet>
<type>cat</type>
<name pos="1">Yamada</name>
<name pos="2">tama</name>
<age>1</age>
</pet>
</pets>
END
my @target_hierarchy = qw(pets pet name);
my @work_hierarchy = ();
my $call_back = undef;
my $parser = XML::SAX::ParserFactory->parser( Handler => MySAXHandler->new );
$parser->parse_string($xml);
{
package MySAXHandler;
use base qw(XML::SAX::Base);
sub start_element {
my ( $self, $el ) = @_;
push @work_hierarchy, $el->{LocalName};
$call_back = undef;
if ( _check_hierarchy() ) {
if ( exists( $el->{Attributes} )
and exists( $el->{Attributes}->{'{}pos'} )
and $el->{Attributes}->{'{}pos'}->{Value} )
{
my $posision = $el->{Attributes}->{'{}pos'}->{Value};
if ($posision eq '1') {
$call_back = \&_say_first;
}
elsif ($posision eq '2') {
$call_back = \&_say_second;
}
else {
warn 'Unknown ', $posision;
}
}
}
}
sub end_element {
my ( $self, $el ) = @_;
$call_back = undef;
pop @work_hierarchy;
}
sub characters {
my ($self, $data) = @_;
if ( defined $call_back ) {
$call_back->( $data->{Data} );
}
}
sub _check_hierarchy {
if ( $#target_hierarchy != $#work_hierarchy ) {
return 0;
}
else {
for ( my $i = 0; $i <= $#target_hierarchy; $i++ ) {
return 0 if ( $target_hierarchy[$i] ne $work_hierarchy[$i] );
}
return 1;
}
}
sub _say_first {
my $name = shift;
say "1: $name";
}
sub _say_second {
my $name = shift;
say "2: $name";
say '---';
}
1;
}
------
$ perl -w foo.pl
1: Yamada
2: Taro
---
1: Yamada
2: tama
---
ご回答ありがとうございました。
スクリプト全体をご提供いただきありがとうございます。
早期にご回答いただいたにも関わらず、メールの連絡がされず、気がついていませんでした。
自分でも無事、自己解決しました。
いただいたスクリプトも今後、研究させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- WordPress(ワードプレス) ワードプレスにて .xmlファイルの使い方をご存知の方、よろしくお願いいたします。 2 2022/09/30 00:55
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- アプリ おすすめのパスワード管理アプリを教えてください。(iOSとWindows対応) 4 2023/01/19 02:08
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- 数学 この数学問題、スマートに解く方法を教えてください。 3 2023/01/26 23:17
- その他(IT・Webサービス) 見たことのない形式で日付が表示されているのでそれを解析してほしい 3 2023/01/23 16:53
- Visual Basic(VBA) 複数ブックの統合について Excel VBA 1 2022/05/13 09:48
- AJAX 自作の地図をグーグルマップのようにしたい 3 2022/11/15 11:53
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTML::TemplateのTMPL_LOOPにつ...
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
-
ループ内での条件処理
-
DOSコマンドのループ内のTIMEコ...
-
アクティブセルから、A列最終行...
-
文字列を変数名として扱う方法
-
VBA Dir関数でファイルをループ...
-
VBA for i=1 to lastrow
-
QNo.3258883データベースから取...
-
UWSCの終了の仕方
-
GIFアニメをループさせたくない
-
チェックデジットについて
-
for文とforeach文について
-
while(*s++=*t++)の判定は?
-
範囲指定したセルを1つずつ飛...
-
英語でのシャープとコメの呼び...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について。
-
高速に文字列の比較
-
二つの変数が同じ物を指すよう...
-
@{$protocol_name}
-
CGFloatとは?
-
perlでの平均計算について
-
HTML::Templateのループと配列...
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
VBAのautofilter、criteriaの配...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
おすすめ情報