【问题标题】:How can I parse XML data and insert it into a MySQL database using Perl?如何使用 Perl 解析 XML 数据并将其插入 MySQL 数据库?
【发布时间】:2010-12-17 13:30:00
【问题描述】:

这是我想要完成的事情:

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

问题:

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

    OR

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

棘手的部分:

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

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

【问题讨论】:

  • 你的问题很混乱。提供一些示例代码可能会有所帮助,其中 cmets 会解释您希望在当前遇到困难的地方完成什么。
  • 您能否将您的代码和数据编辑成一个小样本来展示您要解决的问题?
  • 不清楚现在。浓缩问题对于您能够清楚地解释问题和每个人(包括您自己)都理解它是必要的。
  • 您认为重要的部分是仅与遇到与您几乎完全相同的问题的人相关的部分。如果您删除以 java 为中心的术语,修剪示例,并在更抽象的层次上描述想要什么,而不依赖于您过去的经验,那么您的问题将对更广泛的受众更具吸引力,并且您可能会学习到更适合 perl 的解决方案。
  • 请提供 XML 样本,以及您希望在数据库中发生的情况。

标签: xml perl sax


【解决方案1】:

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

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

【讨论】:

  • 现在正在生成小程序,这将清楚地解释要实现的目标。创建示例脚本后,我将立即发布我的回复。
  • 是的。我的问题是第 2 步。我可以解析 XML,但我想要完成的是在解析 XML 时动态生成插入语句。我已经创建了像 Offer.pm 这样的模块,它会给我插入语句,但我的查询是关于如何在解析 XML 时动态调用这些模块。
【解决方案2】:

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

【讨论】:

  • 如前所述,我正在使用 SAX 解析器,因此在触发事件时完成解析。现在,我如何生成用于插入数据库的 SQL 插入?
  • SAX 解析仅仅意味着您需要自己保留读取元素的历史记录——因此您需要缓存所有相关元素,直到将数据移至数据库。对于此任务,您需要一个哈希作为缓存 - 在每条新记录之后,您可以根据哈希/缓存创建 SQL,并在每个逻辑元素之后将其设为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多