perlを利用してXMLデータを解析したいと思っています。


対象となるXMLデータは以下のようなデータです

例ここから
<reports>
<item name="fruit" source="01">banana</item>
<item name="fruit" source="02">apple</item>
<item name="fruit" source="03">strawberry</item>
<item name="pc" source="01">Desk</item>
<item name="pc" source="02">Note</item>
</reports>
例ここまで
*例ではname属性の値にはfruitとpcだけですが、実際には色々な値があります。

name属性の指定してitem要素の内容(例でのbananaやNote)やsource属性の値を得したいと思っております
xml解析にはモジュールを利用するのが良いみたいですが、その使い方も良くわかりません。

perlを利用して上記の様に値を取得するプログラムを実際に書いて教えてください。

よろしくお願いします。

回答の条件
  • 1人1回まで
  • 登録:2007/11/21 19:16:26
  • 終了:2007/11/28 19:21:11

回答(2件)

id:minesouta No.1

みねそうた回答回数23ベストアンサー獲得回数22007/11/22 00:39:40

ポイント35pt
#!perl
use XML::Simple;

my $file_name = "data.xml"; # xmlファイル
my $xml = 
	XML::Simple->new->XMLin($file_name,  KeyAttr=>{"name"});

my $target_name = 'fruit';  # 得たいname属性

for $target ( @{$xml->{item}} ){

	if( $target->{name} eq $target_name ){
		print $target->{content}, "\n";
	}

}

XML::Simple がない場合はインストールしてください。

Perl モジュール XML::Simple の使い方

id:bonlife No.2

回答回数421ベストアンサー獲得回数752007/11/22 13:12:43

ポイント35pt

最近、XPathが流行っていますし、XML::XPathを使う方法はいかがでしょう。

#!/usr/bin/perl

use strict;
use warnings;
use XML::XPath;

my $xml_data = <<EOM;
<reports>
<item name="fruit" source="01">banana</item>
<item name="fruit" source="02">apple</item>
<item name="fruit" source="03">strawberry</item>
<item name="pc" source="01">Desk</item>
<item name="pc" source="02">Note</item>
</reports>
EOM

my $xp = XML::XPath->new(xml=>$xml_data);

# ファイルから読み込む場合は以下のようにする
# my $file = 'sample.xml';
# my $xp = XML::XPath->new(filename=>$file);

my $nodeset = $xp->find('//item[@name="fruit"]');

foreach my $node ($nodeset->get_nodelist) {
    print "NODE   : ", XML::XPath::XMLParser::as_string($node), "\n";
    print "VALUE  : ", $node->string_value, "\n";
    print "SOURCE : ", $node->find('@source'), "\n";
}

出力は以下のようになります。

NODE   : <item name="fruit" source="01">banana</item>
VALUE  : banana
SOURCE : 01
NODE   : <item name="fruit" source="02">apple</item>
VALUE  : apple
SOURCE : 02
NODE   : <item name="fruit" source="03">strawberry</item>
VALUE  : strawberry
SOURCE : 03

コメントはまだありません

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

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

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

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