Как я могу проанализировать данные XML и вставить их в базу данных MySQL, используя Perl? - PullRequest
1 голос
/ 17 ноября 2009

Вот что я пытаюсь сделать:

В более широком смысле, проанализируйте данные XML, используя анализатор SAX, и вставьте их в соответствующий столбец базы данных в таблице MySQL.

Вот образец Books.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2009 sp1 (http://www.altova.com)-->
<bks:books xsi:schemaLocation="urn:books Untitled1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bks="urn:books">
        <book id="String">
                <author>String</author>
                  <authorFirstName>String</authorFirstName>
                  <authorLastName>String</authorLastName>
                <title>String</title>
                   <titleNo>3</titleNo>
                <genre>String</genre>
                <offer>String</offer>
                   <price>3.14159E0</price>
                <pub_date>1967-08-13</pub_date>
                <review>String</review>
                  <reviewsratings></reviewratings>
        </book>
</bks:books>

Скрипт Perl, использующий SAX Parser:

#!usr/bin/perl -w

use XML::SAX::ParserFactory;
use MySaxHandler;
my $handler = MySaxHandler->new();
my $parser = XML::SAX::ParserFactory->parser(Handler => $handler);
$parser->parse_uri("books.xml")

Модуль обработчика парсера SAX MySaxHandler.pm:

package MySaxHandler;
use Data::Dumper;
use base qw(XML::SAX::Base);
my $in_books = 0;
sub start_document{
    my($self,$data) = @_;
    print "Parsing Started:\n";
}
sub start_element {
    my ($self,$data) = @_;
    my %attribs = %{$data->{'Attributes'}}; foreach( keys( %attribs )) { print " $_ = " . $attribs{$_}->{Value} . "\n"; } # -> Prints values of attributes.
    print "Starting element: ".$data->{Name}."\n\t";
    $in_books++;
    }
sub end_element {
    my($self,$data) = @_;
    print "\t Ending element:".$data->{Name}."\n";
    $in_books--;
}
sub characters{
    my($self,$data) = @_;
     if($in_productOffering){
      print "\t Element Values:".$data->{Data}."\n";
     }
}
sub end_document{
    my($self,$data) = @_;
        print "Parsing Completed\n";
}
1;

Шаги:

  1. Синтаксический анализ XML с использованием XML :: SAX parser
  2. Для каждого узла в XML, если у него есть дочерние узлы, затем проходите через него и, как только я достигну конечного узла, динамически генерируем оператор вставки для вставки этого значения узла в столбец таблицы базы данных; например, если у меня конечный узел XML имеет значение price, а его родительский узел - offer, тогда сценарий Perl должен вставить значение узла price в столбец price таблицы offer в базе данных.
  3. У меня большой XML-файл, который имеет много узлов, и каждый узел, в свою очередь, имеет много дочерних узлов и больших дочерних узлов.

Вопрос:

  1. Как вставить значения элемента теги в books.xml в соответствующие Колонки базы данных MySQL for. E.g. price value should go into offer table's price column пока я Разбор XML с использованием SAX Парсер?

    OR

  2. Как я могу сгенерировать все вставки, и как только у меня будут все операторы вставки, затем перейдите и подключитесь к базе данных MySQL и просто выведите их?

Хитрая часть:

Сложность в том, что есть некоторые данные, которые имеют взаимозависимости. Например. price узел в offer родительском узле также связан с default price узлом, и поэтому при создании операторов вставки мы должны помнить, что значения правильно вставлены в базы данных, но мы не можем использовать таблицу MynoDB MySQL. но единственный двигатель, который нам разрешено использовать - это MyISAM .

Каковы возможные предложения в Perl для решения этих проблем?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Я думаю, что ваша проблема - второй шаг.Исходя из вашего описания проблемы, кажется, что вам нужно собрать больше информации, прежде чем вставлять запись.Вместо того, чтобы вставлять запись, как только вы достигнете узла, подождите, пока вы не соберете все, что вам нужно.Это может означать, например, добавление записи в очередь.

Это все, что я могу сказать, основываясь на весьма ограниченной информации, которую вы предоставили.Если вам нужен лучший совет, создайте небольшой демонстрационный скрипт, возможно, с примерами данных, который иллюстрирует то, что вы пытаетесь сделать.Когда у меня возникают подобные проблемы, я тестирую идеи в небольших программах вместо большого производственного кода.

0 голосов
/ 18 ноября 2009

Из моего pov вы можете попытаться сначала заполнить данные внутренней структурой данных Perl (либо объектом, либо хэшем).
Затем я написал бы SQL на основе этой структуры данных - таким образом, вы разъединили базу данных и парсинг XML.
Это зависит от объема данных, если вам лучше выполнить массовую вставку или выполнить коммит после каждого элемента.

...