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あり、その親ノードがであるoffer場合、Perlスクリプトはデータベースのテーブルの列にpriceノードの値を挿入する必要があります。priceoffer
  3. 多くのノードを持つ大きなXMLファイルがあり、各ノードには多くの子ノードと孫ノードがあります。

質問:

  1. for. E.g. price value should go into offer table's price columnSAXパーサーを使用してXMLを解析しているときに、books.xmlの要素タグの値を適切なMySQLデータベース列に挿入するにはどうすればよいですか?

    OR

  2. どうすればすべての挿入を生成できますか?すべての挿入ステートメントを取得したら、MySQLデータベースに接続してそれらをダンプするだけですか?

トリッキーな部分:

トリッキーな部分は、相互依存性のあるデータがいくつかあることです。たとえばpriceoffer親ノードのノードもノードに関連してdefault priceいるため、挿入ステートメントを生成する際には、値がデータベースに適切に挿入されることに注意する必要がありますが、MySQLのInnoDBテーブルを使用することは許可されていませんが、許可されている唯一のエンジンです。使用はMyISAMです。

これらの問題を回避するためにPerlで可能な提案は何ですか?

4

2 に答える 2

2

あなたの問題はステップ2だと思います。問題の説明に基づくと、レコードを挿入する前に、より多くの情報を収集する必要があるようです。ノードに到達したらレコードを挿入する代わりに、必要なものがすべて収集されるまで待ちます。たとえば、レコードをキューに追加することを意味する場合があります。

あなたが提供した非常に限られた情報に基づいて私が言えるのはそれだけです。より良いアドバイスが必要な場合は、おそらくサンプルデータを使用して、実行しようとしていることを示す小さなデモスクリプトを作成します。このような問題が発生した場合、大きな本番コードではなく、小さなプログラムでアイデアをテストします。

于 2009-11-17T21:34:15.697 に答える
0

私の視点から、最初にデータをPerlの内部データ構造(オブジェクトまたはハッシュ)に入力しようとするかもしれません。
次に、このデータ構造に基づいてSQLを記述します。これにより、データベースとXML解析が分離されました。
すべてのアイテムの後に一括挿入またはコミットを実行する方がよい場合は、データの量によって異なります。

于 2009-11-18T05:31:12.840 に答える