2009-03-30 6 views
0

さまざまなフォーマットのXML文書をMySQLデータベースのレコードに毎日処理する必要があります。各XML文書から私が必要とするデータには、必要のない多くのデータが散在しており、各文書のノード名は異なります。たとえば、次のようにXMLを良い形でMySQLに処理する

ソース#1:

<object id="1"> 
    <title>URL 1</title> 
    <url>http://www.one.com</url> 
    <frequency interval="60" /> 
    <uselessdata>blah</uselessdata> 
</object> 
<object id="2"> 
    <title>URL 2</title> 
    <url>http://www.two.com</url> 
    <frequency interval="60" /> 
    <uselessdata>blah</uselessdata> 
</object> 

ソース#2:

<object"> 
    <objectid>1</objectid> 
    <thetitle>URL 1</thetitle> 
    <link>http://www.one.com</link> 
    <frequency interval="60" /> 
    <moreuselessdata>blah</moreuselessdata> 
</object> 
<object"> 
    <objectid>2</objectid> 
    <thetitle>URL 2</thetitle> 
    <link>http://www.two.com</link> 
    <frequency interval="60" /> 
    <moreuselessdata>blah</moreuselessdata> 
</object> 

...私は、オブジェクトのID、間隔、およびURLを必要としています。アプローチのため

私のアイデアがあります:

1)各XML文書を解析し、反復的に別々の機能は、各文書を解析持っている機能

2)内からSQLクエリを作成するために別の機能を持ちます各オブジェクトを自分のオブジェクトクラスに反復的に追加し、SQLメソッドをクラスメソッドで実行させます。

3.)XSLTを使用してすべてのドキュメントを共通のXML形式に変換し、そのドキュメントのパーサを作成します。

ほとんどの場合、1MB未満となるため、XML文書自体はそれほど大きくはありません。私はその構造が頻繁に変わることは予想していませんが、時間が経つにつれて追加のソースを追加したり削除したりする可能性が強くなっています。私はすべてのアイデアを公開しています。

また、上記のXMLサンプルがマングリングされていてもごめんなさい...大したことではありません。各ドキュメントのノード名が異なることを示すのは大まかなことです。

答えて

2

XSLTの使用は過剰です。私はアプローチ(2)が好きです、それは多くの意味があります。

Pythonを使用して、すべてのドキュメントタイプに対してクラスを作成しようとします。クラスはdictを継承し、その文書上では、与えられた文書を解析し、 'id'、 'interval'、 'url'を自身に設定します。

次にmainのコードは本当に些細なことですが、これらのクラスのインスタンス(適切なドキュメントでもあります)を適切なドキュメントでインスタンス化し、通常のdictsとして渡します。

+0

+1:あなたのケースでは、異なるXMLドキュメントは本当にただです異なるタグ名。これらは、次に、ElementTree findおよびfindall関数で使用するXPath文字列を変更するだけです。異なるXML解析オプションは本当に簡単です。 –

0

私はバリアント3番目のアプローチをうまく使っています。しかし、私が処理していた書類ははるかに大きかった。それが過度の場合でも、実際にはあなたがXSLTをどの程度使い慣れているかによっても変わります。あなたの様々な入力形式があいまいでない場合は

0

、あなたがこれを行うことができます:あなたのサンプル入力の場合

<xsl:template match="object"> 
    <object> 
    <id><xsl:value-of select="@id | objectid" /></id> 
    <title><xsl:value-of select="title | thetitle" /></title> 
    <url><xsl:value-of select="url | link" /></url> 
    <interval><xsl:value-of select="frequency/@interval" /></interval> 
    </object> 
</xsl:template> 

を、これが生成します。しかし

<object> 
    <id>1</id> 
    <title>URL 1</title> 
    <url>http://www.one.com</url> 
    <interval>60</interval> 
</object> 
<object> 
    <id>2</id> 
    <title>URL 2</title> 
    <url>http://www.two.com</url> 
    <interval>60</interval> 
</object> 
<object> 
    <id>1</id> 
    <title>URL 1</title> 
    <url>http://www.one.com</url> 
    <interval>60</interval> 
</object> 
<object> 
    <id>2</id> 
    <title>URL 2</title> 
    <url>http://www.two.com</url> 
    <interval>60</interval> 
</object> 

、使用可能なを達成するために、より高速な方法があるかもしれません結果はXSLTを使用するよりも優れています。どのアプローチがどれほど速いかを測定し、あなたの気持ちが「醜い」場合は、私は、XSLTはXMLを処理するためのより洗練された/維持可能なソリューションだと言いがちです。 YMMV。あなたの入力形式があいまいであり、上記の解決策は、より明示的なaproachはの線に沿って、必要とされ、間違った結果を生成する場合

<xsl:template match="object"> 
    <object> 
    <xsl:choose> 
     <xsl:when test="@id and title and url and frequency/@interval"> 
     <xsl:apply-templates select="." mode="format1" /> 
     </xsl:when> 
     <xsl:when test="objectid and thetitle and link and frequency/@interval"> 
     <xsl:apply-templates select="." mode="format2" /> 
     </xsl:when> 
    </xsl:choose> 
    </object> 
</xsl:template> 

<xsl:template match="object" mode="format1"> 
    <id><xsl:value-of select="@id" /></id> 
    <title><xsl:value-of select="title" /></title> 
    <url><xsl:value-of select="url" /></url> 
    <interval><xsl:value-of select="frequency/@interval" /></interval> 
</xsl:template> 

<xsl:template match="object" mode="format2"> 
    <id><xsl:value-of select="objectid" /></id> 
    <title><xsl:value-of select="thetitle" /></title> 
    <url><xsl:value-of select="link" /></url> 
    <interval><xsl:value-of select="frequency/@interval" /></interval> 
</xsl:template> 
関連する問題