如何解析XML数据并使用Perl将其插入MySQL数据库?

时间:2009-11-17 17:53:50

标签: xml perl sax

这是我想要完成的事情:

从广义上讲,使用SAX解析器解析XML数据并将其插入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>

使用SAX Parser的Perl脚本:

#!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 :: SAX解析器解析XML
  2. 对于XML中的每个节点,如果它有子节点,则遍历它,一旦到达叶节点,然后动态生成插入语句,以便将该节点值插入到数据库表的列中;例如,如果我将XML叶节点设为price且其父节点为offer,则Perl脚本应在price列的price列中插入offer节点的值数据库中的表。
  3. 我有一个大型XML文件,它有许多节点,每个节点又有许多子节点和大子节点。
  4. 问题:

    1. 如何插入元素值 在books.xml中的标签进入相应的 我是MySQL数据库列for. E.g. price value should go into offer table's price column 使用SAX解析XML 解析器?

      OR

    2. 如何生成所有插入,一旦我拥有所有插入语句,然后连接到MySQL数据库并转储它们?

    3. 棘手的部分:

      棘手的部分是有一些数据具有相互依赖性。例如。 price父节点中的offer节点也与default price节点相关,因此在生成insert语句时我们必须记住,值已正确插入到数据库中,但我们不允许使用InnoDB的MySQL表,但我们允许使用的唯一引擎是MyISAM

      Perl可以解决这些问题的哪些建议?

2 个答案:

答案 0 :(得分:2)

我认为你的问题是第二步。根据您对问题的描述,您可能需要在插入记录之前收集更多信息。一旦到达节点,而不是插入记录,请等到收集所需的所有内容。例如,这可能意味着将记录添加到队列中。

根据您提供的非常有限的信息,我只能说。在您需要更好的建议时,可以使用示例数据构建一个小型演示脚本,以说明您要执行的操作。当我遇到这些问题时,我会用小程序而不是大的生产代码来测试想法。

答案 1 :(得分:0)

从我的pov中,您可能会尝试首先将数据填充到Perl内部数据结构(对象或哈希)中。 然后我会根据这个数据结构编写SQL - 因此你已经解耦了数据库和XML解析 它取决于数据量,如果您最好在每个项目之后执行批量插入或执行提交。