XMLの出力順を正しくしたい

実現したいこと

Linux上でperlを動かして、xlsxからXMLを作成しているところです。
xlsxファイルの読み込み、XMLへの出力自体はうまくいっています。

発生している問題・分からないこと

ですが、生成過程の中で、順番に入れたはずの値が異なった順序になって出力されていました。ソートが必要なのでしょうが、どのようにソートしたらいいか困っています。

該当のソースコード

test.pl

1# 一部抜粋 2#!/usr/bin/perl 3use Spreadsheet::ParseXLSX; 4use XML::Simple; 5use open ":utf8"; 6 7my $results = []; #xml出力用オブジェクト 8for my $worksheet ( $workbook->worksheets() ) { 9 #中略 10 my $ar_tmp = {}; #ここに取得した値を代入していく 11 $result ->{'id'} = $ar_tmp[0]; #id 12 $result ->{'kind'} = $ar_tmp[1]; #kind 13 $result ->{'name'} = $ar_tmp[2]; #name 14 $result ->{'area'} = $ar_tmp[3]; #area 15 $result ->{'place'} = $ar_tmp[4]; #place 16 push @$results, $result; 17} 18 19#xml出力 20my $Val = { 21 'result' => $results 22}; 23my $x = new XML::Simple; 24my $xml = qq(<?xml version="1.0" encoding="UTF-8" ?>\n); 25$xml .= $x -> XMLout($Val, RootName => 'results', NoAttr=>1); 26 27#ファイルの保存 28open(DATAFILE, ">", "test.xml") or die("ERR:$!"); 29print DATAFILE $xml; 30close(DATAFILE); 31

test.xml

1<!-- 正しい順番はid、kind、name、area、place --> 2<results> 3 <result> 4 <name>name</name> 5 <area>area</area> 6 <id>id</id> 7 <kind>kind</kind> 8 <place>place</place> 9 </result> 10</results>

試したこと・調べたこと

上記の詳細・結果

代入しているのがオブジェクトであるため優先順位が保証されないものだとはわかりましたが、だとしたら、どうやって正しい順序に変えることができるのか、その方法を伝授していただければと思います。

ちなみにXML::XSLTを用いてtransformする方法は試してそれは成功していますが、perlの中でソートを変えたいのが今回の主旨です。

補足

当初はwindowsのactiveperlで動作確認してみたのですが、今回の動作には適さないことがわかり、それでLinux(VirtualBox6.4、centos7.6)で操作しています。また、Perl以前にPython3でも試してみたのですが、肝心のXML操作の時点で躓きました(日本語のXMLにうまく対応してくれない)。

コメントを投稿

0 コメント