2009-11-09 5 views
5

厳密なスキーマ(特にthis one)に準拠した大量のXMLファイルを解析する方法を探しています。私たちがやりたいことは、いくつかのデータベーステーブルとXMLファイルの間に1対1のデータマッピングを作成することです。そのため、Webサービスソフトウェアパッケージがファイルを挿入するテーブルにトリガを設定し、自動的に解析し、私たちが定義したように、データをデータベースに格納します。XML-to-SQLマッピング

MicrosoftのSQL Serverなどの領域でこれを実現するにはどうすればよいでしょうか?

+0

XMLスキーマのDBスキーマを自動的に作成しますか? –

+0

いいえ、XML XSDと別の既存のDBスキーマがあるので、マッピングを明示的に指定したいと考えています。 – tearman

答えて

1

。その後、パッケージを実行します。パッケージ内には、スキーマ、マッピングなどを指定することができます。SSISには "For Each File In Directory"コンテナなどがあります。

0

あなたがやりたいようなサウンドは、XMLをSQLServerの一括インポートツールで使用可能な形式に変換するXSLトランスフォームを作成することです。 (私は主にOracleを使用してSQLServer側で何が利用できるのか分かりません)

もう1つの方法として、XMLをSQLの 'insert'文に変換し、その結果をSQLスクリプトとして実行します。

どのアプローチを選択する場合でも、トランザクションの境界を考慮して、入力内のエラーまたは無効なデータがデータベース内で矛盾しないようにすることが重要になります。

4

SQLXMLバルクロード 4.0を使用すると、XMLファイルをSQL Serverテーブルに一括読み込むことができます。
SQLXML bulkloadオブジェクトは、XMLデータファイルとスキーマファイルを使用します。

SCHEMA(XSDまたはXML)ファイルには、XMLノードとデータベース列名の間にのマッピング情報が含まれています。

set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0") 
objBL.ConnectionString = "Connection String" 
objBL.ErrorLogFile = "c:\error.log" 
objBL.Execute "SampleSchema.xml", "SampleXMLData.xml" 

http://msdn.microsoft.com/en-us/library/ms171878.aspx

http://msdn.microsoft.com/en-us/library/ms171806.aspx

次のサンプルデータファイルとスキーマファイルです。

データファイル

<ROOT> 
    <Order OrderID="11" CustomerID="ALFKI"> 
    <Product ProductID="11" ProductName="Chai" /> 
    <Product ProductID="22" ProductName="Chang" /> 
    </Order> 
    <Order OrderID="22" CustomerID="ANATR"> 
    <Product ProductID="33" ProductName="Aniseed Syrup" /> 
    <Product ProductID="44" ProductName="Gumbo Mix" /> 
    </Order> 
</ROOT> 

スキーマ定義あなたがXMLデータソース(S)と "ETLパッケージ" を作成するために、SSISを使用して検討することもでき

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
<xsd:annotation> 
    <xsd:appinfo> 
    <sql:relationship name="OrderOD" 
      parent="Ord" 
      parent-key="OrderID" 
      child="OrderDetail" 
      child-key="OrderID" /> 

    <sql:relationship name="ODProduct" 
      parent="OrderDetail" 
      parent-key="ProductID" 
      child="Product" 
      child-key="ProductID" 
      inverse="true"/> 
    </xsd:appinfo> 
</xsd:annotation> 

    <xsd:element name="Order" sql:relation="Ord" 
          sql:key-fields="OrderID" > 
    <xsd:complexType> 
    <xsd:sequence> 
     <xsd:element name="Product" sql:relation="Product" 
        sql:key-fields="ProductID" 
        sql:relationship="OrderOD ODProduct"> 
      <xsd:complexType> 
      <xsd:attribute name="ProductID" type="xsd:int" /> 
      <xsd:attribute name="ProductName" type="xsd:string" /> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
     <xsd:attribute name="OrderID" type="xsd:integer" /> 
     <xsd:attribute name="CustomerID" type="xsd:string" /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

SQLXMLBulkLoadは、大量のXMLファイルを比較的少量のデータで処理するシナリオで、重大なパフォーマンスの問題を引き起こすことが知られています。その理由は、内部的に各ファイルを処理するための一時的なステージングテーブルをたくさん作成するからです。これを避けるには、一度にいくつかのXMLファイルをマージし、それらをバルクロードする必要があります。また、すべてのファイルがローカルドライブに存在することを確認してください。 –