1

这是我想要完成的事情:

在更广泛的意义上,使用 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 解析器的 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并且它的父节点是,那么 Perl 脚本应该在数据库表的列中offer插入price节点的值。priceoffer
  3. 我有一个很大的 XML 文件,它有很多节点,每个节点又有很多子节点和大子节点。

问题:

  1. 在使用 SAX Parser 解析 XML 时,如何将 books.xml 中的元素标记值插入到适当的 MySQL 数据库列for. E.g. price value should go into offer table's price column中?

    OR

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

棘手的部分:

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

Perl 中有哪些可能的建议来解决这些问题?

4

2 回答 2

2

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

根据您提供的非常有限的信息,我只能说这些。如果您想要更好的建议,请构建一个小的演示脚本,可能带有示例数据,以说明您正在尝试做什么。当我遇到这类问题时,我会在小程序中测试想法,而不是在大型生产代码中。

于 2009-11-17T21:34:15.697 回答
0

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

于 2009-11-18T05:31:12.840 回答