XML::Simpleを使ったXMLデータへのアクセス方法
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.参考サイト
参考サイトは以下です。ありがとうございました。
Posted by yujiro このページの先頭に戻る
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて
トラックバックURL
コメントする
greeting