Database created with perl stored as xml -
i'm trying save complex array/hash structure xml. i'm new both perl , xml don't know easiest way this.
all xml parser, writer, libxml, etc. modules don't give me want. e.g. dumpxml adds lots of tags. have tried many different modules none of them seem want or don't know how set them work want them to. maybe have write xml part on lower level? or maybe it's best if don't use perl data structures store directly xml?
the idea create php webpage xml data. unfortunately i'm php noob , therefore hoping doing won't big problem. :-) wanted have logical layout of xml file in examples below.
here's how tried 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; $content = {}; # usage: add_content_entry(name, group, descr) sub add_content_entry { $name = shift; $group = shift; $descr1 = shift; $descr2 = shift; $data = { descr1 => $descr1, descr2 => $descr2, }; @pos = split('/', $group); push @pos, $name; diveval( $content, @pos ) = $data; } sub xml_read { $xml = xml::smart->new('file.xml'); $content = $xml->data; } sub xml_write { $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 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 written $content = {}; &xml_read; # justify file.xml can read print dumper $content;
the output should be:
$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' } } } };
my problem number of levels not same different contents.
in xml file there should (i know sorting arbitrary. kept same in output of 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>
or
<?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>
you should check out dbd::anydata , see if meets needs. supports using xml files same way sql database.
Comments
Post a Comment