База данных, созданная с помощью Perl, хранится в формате XML - PullRequest
3 голосов
/ 02 июля 2011

Я пытаюсь сохранить сложную структуру массива / хэша в XML.Поскольку я новичок как в perl, так и в xml, я не знаю, как проще всего это сделать.

Все модули xml-анализатора, writer, libxml и т. Д. Не дают мне то, что я хочу,Например, DumpXML добавляет много тегов.Я пробовал много разных модулей, но ни один из них, кажется, не делает то, что я хочу, или я не знаю, как настроить их так, чтобы они работали так, как я хочу.Может быть, я должен написать часть XML на более низком уровне?Или, может быть, будет лучше, если я не буду использовать структуры данных perl, а сохраню их непосредственно в xml?

Идея состоит в том, чтобы создать веб-страницу php из данных xml.К сожалению, я тоже 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>

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Я хотел бы предложить вам рассмотреть возможность использования YAML в качестве альтернативы XML.Как вы сказали, XML имеет тенденцию быть раздутым с тегами.Вывод YAML намного чище и предназначен для чтения людьми.

Таким образом, вывод ваших данных может выглядеть примерно так:

  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

В Perl вы можете использовать YAML ::XS модуль.Существуют модули PHP, которые также могут распознавать YAML.

1 голос
/ 02 июля 2011

Вы должны проверить DBD :: AnyData и посмотреть, соответствует ли оно вашим потребностям.Он поддерживает использование файлов XML так же, как и базу данных SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...