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);#値表示
}
}
}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/05/12 23:09:35
  • 終了:2006/05/14 11:23:21

回答(1件)

id:le_chocolate No.1

le_chocolate回答回数4ベストアンサー獲得回数02006/05/13 00:02:54

ポイント60pt

my $attribute = shift;

local $attribute = shift;

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

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

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

id:stray_sheep

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

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

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

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

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

&parseTable($element,\%attribute);

sub parseTable {

my $element = shift;

my $parent = shift;

my %child = ();

#ここで属性値の継承

&parseTable($_,$child);

}

2006/05/14 11:22:25
  • id:le_chocolate
    sub parseTable {

    my $element = shift;
    my $parent = shift;
    my %child = ();
    #ここで属性値の継承
    &parseTable($_,$child);
    }

    これって本当ですか?

    childが別変数になっていますよ?
    写し間違いならいいのですが…。

    Perlスクリプトを書く場合は、最初のほうで。
    use strict;
    という宣言をしておいたほうがよろしいかと思います。
    変数の間違いなんかをエラーで拾ってくれますので。


    お力になれず、申し訳ありませんでした。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません