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

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

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

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 -- 魔法の組み合わせ
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


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

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

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

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