代码之家  ›  专栏  ›  技术社区  ›  Clay

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

  •  1
  • Clay  · 技术社区  · 7 年前

    从广义上讲,使用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>
    

    #!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中的每个节点,如果它有子节点,则遍历它,一旦到达叶节点,则动态生成insert语句,以便将该节点值插入数据库表的列中;e、 例如,如果将XML叶节点作为 price 它的父节点是 offer 价格 价格 一栏 数据库中的表。
    2. 我有一个很大的XML文件,它有许多节点,每个节点依次有许多子节点和孙子节点。

    问题:

    1. 如何插入元素的值 for. E.g. price value should go into offer table's price column 当我在的时候 使用SAX通过XML进行解析 解析器?

      OR

    2. 我如何生成所有的insert语句,一旦我有了所有的insert语句,就可以连接到MySQL数据库并转储它们?

    棘手的部分:

    棘手的是,有些数据具有相互依赖性。例如。 价格 节点 提供 default price 因此,在生成inserts语句时,我们必须记住,值被正确地插入到数据库中,但我们不允许使用MySQL的InnoDB表,但我们允许使用的唯一引擎是 MyISAM .

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   brian d foy    16 年前

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

        2
  •  0
  •   weismat    16 年前

    从我的观点来看,您可以尝试先将数据填充到Perl内部数据结构中(对象或散列)。
    然后,我将基于此数据结构编写SQLs—这样您就将数据库和XML解析解耦了。