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

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

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

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

Perl

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

Q&A

0回答

129閲覧

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

FKM

総合スコア3640

XML

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

Perl

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

0グッド

0クリップ

投稿2024/04/19 08:18

編集2024/04/19 09:32

実現したいこと

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>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

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

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

補足

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

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

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

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

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

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

yambejp

2024/04/19 08:36

そもそもxlsxはXMLをzipで固めたものですから解凍してXMLを取り出せばいいのでは?
FKM

2024/04/19 09:30 編集

my $zip = Archive::Zip->new('test.xlsx'); とやってみたら、 [Content_Types].xmlという日付が1979/12/31のファイルが作られただけでした。Perlはそこまで詳しくないので、まだまだ経験不足なんでしょうが。
FKM

2024/04/19 09:40

なるほど、仮にPerl側でソートできても、XML::Simpleで出力するときに、順番が保証されないということですね。
draq

2024/04/22 09:40

XML::DOM::Parser 使って自分で DOM 構築すればいいのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問