人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PerlでXMLを解析しようと思っています。
XMLは属性をもち、以下のような構造を取ります
<div width=10>
<div width=20></div>
</div>
ここで入れ子になっている部分の属性widthの値を取得するときに親の値を加味(継承して)30という値を取りたいのです。
再帰的な関数を作って実験してみたところ入れ子になった部分を足し合わせていくことは出来たのですが入れ子から抜け出したところでの値の初期化が思うように出来ません。
何か参考になるソースがありましたら、紹介頂けませんでしょうか?

ちなみにモジュールはXML::Mini、ソースは以下のような感じです。(長文のため一部抜粋)
my $element = $xmlDoc->getElementByPath('body');
my %attribute = ();
&parseTable($element,\%attribute);

sub parseTable {

my $element = shift;
my $attribute = shift;

%{$attribute} =();

&extendsAttribute($element,$attribute); #属性値の継承
my $childList = $element->getAllChildren();

&rect($attribute);#値表示
for (@{$childList}) {
if($_->numChildren() > 0){

#子要素を持つ場合
&parseTable($_,$attribute);

}else{

#子要素を持たない場合
&extendsAttribute($_,$attribute); #属性値の継承
&rect($attribute);#値表示
}
}
}

●質問者: stray_sheep
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:BODY mini Perl sub XML
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● le_chocolate
●60ポイント

my $attribute = shift;

local $attribute = shift;

にしてみるとどうでしょうか?

Perlで作るCGI講座 - my と local どう違う? - local について - futomi's CGI Cafe

http://www.futomi.com/lecture/local/local.html

◎質問者からの返答

le_chocolateさん、ご回答ありがとうございます。

お返事が遅くなってしまい、ごめんなさい。

localですが、やってみたところ再帰的な関数内では入れ子を出たときも変数の値をずっと保持したままのようでした。

(私の作り方がまずいのかも知れませんが・・・)

昨日いろいろ試してみたところ、以下の方法で実現できましたのでとりあえず報告させていただきます。(だいたいのイメージです)

&parseTable($element,\%attribute);

sub parseTable {

my $element = shift;

my $parent = shift;

my %child = ();

#ここで属性値の継承

&parseTable($_,$child);

}

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ