質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

CPAN

CPAN(Comprehensive Perl Archive Network)は、 Perlのライブラリ・モジュールやPerlで書かれたソフトウェアを集めまとめたものです。

Q&A

1回答

2646閲覧

Perl ハッシュリファレンスの作成

BANDIT1250FABS

総合スコア86

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

CPAN

CPAN(Comprehensive Perl Archive Network)は、 Perlのライブラリ・モジュールやPerlで書かれたソフトウェアを集めまとめたものです。

0グッド

1クリップ

投稿2017/02/22 05:15

CPANモジュール XML::SimpleのXMLoutを利用してハッシュをXMLに変換したいと思っております。
下記ハッシュのデータをXMLoutの引数として利用可能なリファレンス値にする方法をご存知の方
ご教授いただけますと助かります。

ハッシュ
%hash ( "key1" => "data1"
"key2" => "data2"
);

↓ 変換

XMLoutで利用可能なリファレンス値
$hashRef { "key1" => ['data1']
"key2" => ['data2']
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

指定されたデータに変換する方法が見つからなかったので、作成してみました。
以下の条件であると仮定して作成しています。

  • スカラーは配列化する
  • 連想配列内の連想配列も対象とする
  • 連想配列以外のリファレンスはそのままとする

perl

1use Data::Dumper; 2use XML::Simple; 3use strict; 4use warnings; 5 6# テストデータ 7my $test_data = { 8 test1 => undef, 9 test2 => 'data2', 10 test3 => 'data3', 11 test4 => ['data4'], 12 test5 => { 13 test5_1 => 'data5_1', 14 test5_2 => 'data5_2' 15 }, 16 test6 => { 17 test6_1 => ['data6_1'], 18 test6_2 => ['data6_2'] 19 } 20}; 21print Dumper( _create_xmlout_data($test_data) ); 22print XMLout( _create_xmlout_data($test_data) ); 23 24# 連想配列を展開して、XMLout用データを作成する 25sub _create_xmlout_data { 26 my ($data) = @_; 27 my $res = $data; 28 if ( defined($data) && ref($data) eq 'HASH' ) { 29 30 # 連想配列のリファレンスの場合は 31 # キーごとに調査を行う 32 $res = {}; 33 foreach my $key ( keys( %{$data} ) ) { 34 if ( ref( $data->{$key} ) ) { 35 36 # リファレンスの場合は 37 # 再帰でデータ作成を行う 38 $res->{$key} = _create_xmlout_data( $data->{$key} ); 39 } 40 else { 41 42 # リファレンスで無い場合は 43 # 配列化してデータを格納する 44 $res->{$key} = [ $data->{$key} ]; 45 } 46 } 47 } 48 return $res; 49}

実行結果

$VAR1 = { 'test5' => { 'test5_1' => [ 'data5_1' ], 'test5_2' => [ 'data5_2' ] }, 'test1' => [ undef ], 'test4' => [ 'data4' ], 'test3' => [ 'data3' ], 'test6' => { 'test6_2' => [ 'data6_2' ], 'test6_1' => [ 'data6_1' ] }, 'test2' => [ 'data2' ] }; <opt> <test1></test1> <test2>data2</test2> <test3>data3</test3> <test4>data4</test4> <test5> <test5_1>data5_1</test5_1> <test5_2>data5_2</test5_2> </test5> <test6> <test6_1>data6_1</test6_1> <test6_2>data6_2</test6_2> </test6> </opt>

投稿2017/02/22 07:10

ester41

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問