複雑な配列/ハッシュ構造をxmlに保存しようとしています。 私はperlとxmlの両方に新しいので、これを行う最も簡単な方法は何か分かりません。perlで作成されたデータベースがxmlとして保存されました
すべてのxmlパーサー、ライター、libxmlなどのモジュールは、私が望むものを私に与えません。 など。 DumpXMLはたくさんのタグを追加します。私は多くの異なるモジュールを試しましたが、それらのどれも私が欲しいものをやっているようには見えません。あるいは、それらを設定する方法がわからないので、私が望むように動作します。 xmlの部分を下位レベルで記述する必要があるかもしれませんか? 私はperlのデータ構造を使用せず、xmlに直接格納するのが最善でしょうか?
アイデアは、XMLデータからPHP Webページを作成することです。 残念ながら、私はPHPのnoobでもあり、そうすることを望んでいたので大きな問題にはなりません。 :-) 私はちょうど以下の例のようにxmlファイルの論理レイアウトを持っていただけです。
Data::Diver
とXML::Smart
でこれを試したことがあります。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Data::Diver qw(Dive DiveRef DiveVal DiveError);
use XML::Smart;
my $content = {};
# Usage: add_content_entry(name, group, descr)
sub add_content_entry {
my $name = shift;
my $group = shift;
my $descr1 = shift;
my $descr2 = shift;
my $data = {
DESCR1 => $descr1,
DESCR2 => $descr2,
};
my @pos = split('/', $group);
push @pos, $name;
DiveVal($content, @pos) = $data;
}
sub xml_read {
my $xml = XML::Smart->new('file.xml');
$content = $xml->data;
}
sub xml_write {
my $xml = XML::Smart->new(
q`
<?xml version="1.0" encoding="iso-8859-1" ?>
<content></content>
`);
$xml->{content} = $content;
$xml->('file.xml');
}
# Main
&xml_read; # file.xml is empty
&add_content_entry('content.1', 'group.A', 'Hello', 'World');
&add_content_entry('content.2', 'group.B/group.x', 'Fred', 'Flintstone');
&add_content_entry('content.3', 'group.B/group.y', 'bla', 'blah');
&add_content_entry('content.4', 'group.B/group.y', '???', '!!!');
&add_content_entry('content.5', 'group.C/group.z', '...', '...');
&xml_write; # file.xml is written
$content = {};
&xml_read; # justify that file.xml can be read
print Dumper $content;
出力は次のようになります。
$VAR1 = {
'group.A' => {
'content.1' => {
'DESCR2' => 'World',
'DESCR1' => 'Hello'
}
},
'group.C' => {
'group.z' => {
'content.5' => {
'DESCR2' => '...',
'DESCR1' => '...'
}
}
},
'group.B' => {
'group.y' => {
'content.3' => {
'DESCR2' => 'blah',
'DESCR1' => 'bla'
},
'content.4' => {
'DESCR2' => '!!!',
'DESCR1' => '???'
}
},
'group.x' => {
'content.2' => {
'DESCR2' => 'Flintstone',
'DESCR1' => 'Fred'
}
}
}
};
私の問題は、レベルの数は異なる内容で同じではないということです。
xmlファイルには、(私はソートが任意であることを知っています。私はprint Dumper
の出力と同じままです)。
<?xml version="1.0" encoding="iso-8859-1" ?>
<content>
<group.A>
<content.1>
<DESCR2>World</DESCR>
<DESCR1>Hello</DESCR1>
</content.1>
</group.A>
<group.C>
<group.z>
<content.5>
<DESCR2>...</DESCR>
<DESCR1>...</DESCR1>
</content.5>
</group.z>
</group.C>
<group.B>
<group.y>
<content.3>
<DESCR2>blah</DESCR>
<DESCR1>bla</DESCR1>
</content.3>
<content.4>
<DESCR2>!!!</DESCR>
<DESCR1>???</DESCR1>
</content.4>
</group.y>
<group.x>
<content.2>
<DESCR2>Flintstone</DESCR>
<DESCR1>Fred</DESCR1>
</content.2>
</group.x>
</group.B>
</content>
または
<?xml version="1.0" encoding="iso-8859-1" ?>
<content>
<group.A>
<content DESCR2="World" DESCR1="Hello">content.1</content>
</group.A>
<group.C>
<group.z>
<content DESCR2="..." DESCR1="...">content.5</content>
</group.z>
</group.C>
<group.B>
<group.y>
<content DESCR2="blah" DESCR1="bla">content.3</content>
<content DESCR2="!!!" DESCR1="???">content.4</content>
</group.y>
<group.x>
<content DESCR2="Flintstone" DESCR1="Fred">content.2</content>
</group.x>
</group.B>
</content>
すぐに問題を解決するのではなく、トピックを実際に学習する理由を探しているなら、PerlとXML(http://oreilly.com/catalog/9780596002053/)という非常に良いOReillyの本があります。それはブロック上の最新の子供ではありませんが、それはトピックを介して良い実行です。この本で扱われていない新しいモジュールがたくさんありますが、それはあなたを正しい方向に開始し、構築するための良い基礎を提供します。 – DavidO