2011-07-02 12 views
3

複雑な配列/ハッシュ構造をxmlに保存しようとしています。 私はperlとxmlの両方に新しいので、これを行う最も簡単な方法は何か分かりません。perlで作成されたデータベースがxmlとして保存されました

すべてのxmlパーサー、ライター、libxmlなどのモジュールは、私が望むものを私に与えません。 など。 DumpXMLはたくさんのタグを追加します。私は多くの異なるモジュールを試しましたが、それらのどれも私が欲しいものをやっているようには見えません。あるいは、それらを設定する方法がわからないので、私が望むように動作します。 xmlの部分を下位レベルで記述する必要があるかもしれませんか? 私はperlのデータ構造を使用せず、xmlに直接格納するのが最善でしょうか?

アイデアは、XMLデータからPHP Webページを作成することです。 残念ながら、私はPHPのnoobでもあり、そうすることを望んでいたので大きな問題にはなりません。 :-) 私はちょうど以下の例のようにxmlファイルの論理レイアウトを持っていただけです。

Data::DiverXML::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> 
+0

すぐに問題を解決するのではなく、トピックを実際に学習する理由を探しているなら、PerlとXML(http://oreilly.com/catalog/9780596002053/)という非常に良いOReillyの本があります。それはブロック上の最新の子供ではありませんが、それはトピックを介して良い実行です。この本で扱われていない新しいモジュールがたくさんありますが、それはあなたを正しい方向に開始し、構築するための良い基礎を提供します。 – DavidO

答えて

1

あなたはDBD::AnyDataをチェックアウトし、それはあなたのニーズを満たしているかどうかを確認する必要があります。これは、SQLデータベースと同じ方法でXMLファイルを使用することをサポートします。

+0

あなたの答えをありがとう。透明なxmlアクセスとしてこのモジュールを使用できることは間違いありません。もしそうなら、私は 'my $ content = adTie( 'XML'、 'file.xml');'でxmlファイルにアクセスできます。残念ながら、これは私が期待したようには機能しません: 'print Dumper $ content;' $ VAR1 = { 'HASH(0x9d6d8a0)' => [] }; ' – Powderking

+0

私はこのページを見つけました:http: //www.vpservices.com/jeff/programs/AnyData/DBD-AnyData.html 私はそれを見て、私の運をもう一度試します:-) – Powderking

1

XMLの代わりにYAMLを使用することをお勧めします。あなたが言ったように、XMLはタグで肥大化する傾向があります。 YAML出力ははるかにクリーンで、人が読めるように設計されています。あなたはYAML :: XSモジュールを使用することができ、Perlで

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 

だからあなたのデータ出力は、次のようなものを見ることができます。 YAMLも認識できるPHPモジュールがあります。

+0

うーん、前にYAMLについて聞いたことがありません。しかし、それは非常に面白くて使いやすいように見えます。私は今夜​​それを試してみる...ありがとう! – Powderking

+0

うわー、私はほとんど何も読む必要はありませんでした。 yamlの実装はとても簡単です:-) – Powderking