TopProgramming LanguagePerl > XML::Simpleを使ったXMLデータへのアクセス方法
2010年7月 5日

XML::Simpleを使ったXMLデータへのアクセス方法

Posted at July 5,2010 2:55 AM
Category:[Perl]
Tag:[, ]

XML::Simpleで取得したデータへのアクセス方法です。

XML::Simpleを使ったXML要素へのアクセス方法をネットで調べたところ、取得したデータをData::Dumperで出力している例がほとんどで、情報収集に苦労したので、各XML要素への具体的なアクセス方法を掲載しておきます。

といってすべてのケースが網羅できている訳ではありません。予めご了承ください。

1.サンプルXML

サンプルXMLです。これはExcelから出力するXML形式のスプレッドシートを想定しています。文字エンコーディングはUTF-8です。

<?xml version="1.0" encoding="UTF-8"?>
<Workbook>
 <Worksheet>
  <Table>
   <Row>
    <Cell><Data Type="String">番号</Data></Cell>
    <Cell><Data Type="String">種別</Data></Cell>
    <Cell><Data Type="String">ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">1-1</Data></Cell>
    <Cell><Data Type="String">A</Data></Cell>
    <Cell><Data Type="String">10ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">1-2</Data></Cell>
    <Cell><Data Type="String">B</Data></Cell>
    <Cell><Data Type="String">20ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">1-3</Data></Cell>
    <Cell><Data Type="String">C</Data></Cell>
    <Cell><Data Type="String">30ページ</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
 <Worksheet>
  <Table>
   <Row>
    <Cell><Data Type="String">番号</Data></Cell>
    <Cell><Data Type="String">種別</Data></Cell>
    <Cell><Data Type="String">ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">2-1</Data></Cell>
    <Cell><Data Type="String">D</Data></Cell>
    <Cell><Data Type="String">10ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">2-2</Data></Cell>
    <Cell><Data Type="String">E</Data></Cell>
    <Cell><Data Type="String">20ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">2-3</Data></Cell>
    <Cell><Data Type="String">F</Data></Cell>
    <Cell><Data Type="String">30ページ</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
 <Worksheet>
  <Table>
   <Row>
    <Cell><Data Type="String">番号</Data></Cell>
    <Cell><Data Type="String">種別</Data></Cell>
    <Cell><Data Type="String">ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">3-1</Data></Cell>
    <Cell><Data Type="String">G</Data></Cell>
    <Cell><Data Type="String">10ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">3-2</Data></Cell>
    <Cell><Data Type="String">H</Data></Cell>
    <Cell><Data Type="String">20ページ</Data></Cell>
   </Row>
   <Row>
    <Cell><Data Type="String">3-3</Data></Cell>
    <Cell><Data Type="String">I</Data></Cell>
    <Cell><Data Type="String">30ページ</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>

2.Data::Dumperでの出力

1項のXMLデータのData::Dumperで出力を掲載します。3項以降で示すコードとの比較に利用してください。

$VAR1 = {
          'Table' => {
                     'Row' => [
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{756a}\x{53f7}"
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{7a2e}\x{5225}"
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '1-1'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'A'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "10\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '1-2'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'B'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "20\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '1-3'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'C'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "30\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              }
                            ]
                   }
        };
$VAR2 = {
          'Table' => {
                     'Row' => [
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{756a}\x{53f7}"
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{7a2e}\x{5225}"
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '2-1'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'D'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "10\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '2-2'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'E'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "20\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '2-3'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'F'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "30\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              }
                            ]
                   }
        };
$VAR3 = {
          'Table' => {
                     'Row' => [
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{756a}\x{53f7}"
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{7a2e}\x{5225}"
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '3-1'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'G'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "10\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '3-2'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'H'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "20\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              },
                              {
                                'Cell' => [
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => '3-3'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => 'I'
                                                    }
                                          },
                                          {
                                            'Data' => {
                                                      'Type' => 'String',
                                                      'content' => "30\x{30da}\x{30fc}\x{30b8}"
                                                    }
                                          }
                                        ]
                              }
                            ]
                   }
        };

3.サンプル

1項のXMLデータ(text.xml)を出力するサンプルコードです。説明のために、最下層のデータに一気にアクセスせず、順番に取得するようにしています。XMLファイルの取得方法など、より適切なコードがあればアドバイスお待ちしています。

#!/usr/bin/perl
 
use strict;
use utf8;
binmode STDOUT => ":utf8";
use XML::Simple;
 
open(FILE, "./test.xml");
undef $/;
my $xml = new XML::Simple();
my $xmldata = $xml->XMLin(<FILE>);
close(FILE);
 
my @worksheets = @{$xmldata->{Worksheet}};
for my $worksheet (@worksheets) {
    my @rows = @{%{$worksheet}->{Table}->{Row}};
    for my $row (@rows) {
        my @cells = @{%{$row}->{Cell}};
        for my $cell (@cells) {
            print %{$cell}->{Data}->{content};
        }
   }
}

以下、コードの簡単な解説です。

4.Worksheetの取得方法

Worksheetにハッシュでアクセスし、配列にします。

my @worksheets = @{$xmldata->{Worksheet}};

5.Rowの取得方法

4項で取得した@worksheetsをfor文でまわします。$worksheetをハッシュにして、取得したRowを配列にします。

for my $worksheet (@worksheets) {
    my @rows = @{%{$worksheet}->{Table}->{Row}};
    …中略…
}

6.Cellの取得方法

5項で取得した@rowsをfor文でまわします。$rowをハッシュにして、取得したCellを配列にします。

for my $row (@rows) {
    my @cells = @{%{$row}->{Cell}};
    …中略…
}

7.Dataの出力方法

6項で取得した@cellsをfor文でまわします。$cellをハッシュにして、最後に{content}を与えます。

for my $cell (@cells) {
    print %{$cell}->{Data}->{content};
}

8.参考サイト

参考サイトは以下です。ありがとうございました。

Perl 開発者のための XML: 第 1 回 XML と Perl -- 魔法の組み合わせ
Posted by yujiro   このページの先頭に戻る
関連記事
この記事を読んだ人はこんな記事も読んでいます
人気エントリー
Hatena Hot Entries
Hatena Entries
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字 イタリック アンダーライン ハイパーリンク 引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)

Now loading...
Introduction
Entries of this Category
Recent Entries
Recent Comments
Recent Trackbacks
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site
loading ...
Categories
Monthly Archives
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 5.12