2012-02-23 13 views
1

私は以下の構造の大きなXMLファイルを持っています。大きなXMLファイルを解析する必要があります。ベストプラクティス?

<tree> 
    <limb> 
     <DATA0> 
    </limb> 
    <limb> 
     <DATA1> 
    </limb> 
    <limb> 
     <DATA2> 
    </limb> 
</tree> 

子要素を持つ数千の肢の要素があります。私はこのファイルを解析し、四肢の要素を100〜200個のアイテムで抽出し、データから新しいXMLファイルを作成する必要があります。

この操作を実行する方法はありますか?私は初心者/中級レベルのC#しか知りませんし、しばらくXMLファイルで作業しています。

limb要素の総数を数えるループを作成し、必要な新しいXMLドキュメントの数を決定する計算を実行することを検討しています(5000四肢要素/ 200個のバッチ== 25 xmldocuments)。そこから最初の200セットを読み込み、新しいファイルにコピーして保存し、ファイルの最後まで再スタートする必要があります。

ロジックに問題があるようですか?

+2

XMLをあるスキーマから別のスキーマに変換するだけであれば、XSLTがそのジョブのより適切なツールになる可能性があります。 –

+0

通常のパフォーマンス上の問題としてアプローチすることを検討してください。アプリケーションで大きなファイルを使用することに問題がありますか?あなたが問題になっている数字は、XMLを読み込む方法に深刻な問題を引き起こすようなものではありません。 –

答えて

2

ドキュメントが大きすぎてメモリに読み込めない場合は、XmlReaderを使用できます。 XmlReaderの独自のサブクラスを作成します。ファイルがRAMのサイズの10〜20%より大きい場合や、高速である必要がある場合を除き、余計な努力をする必要はありません。ロバートはリンクとして

2

LINQの-TO-XMLは次のようになります。そこには、C#での専門家であればC#でこれを書くための言い訳かもしれないし、何かを学ぶために時間を持っていなかった

XElement xfile = XElement.Load(file); 
var limbs = xfile.Elements("limb"); 
int count = limbs.Count(); 
var first200 = limbs.Take(200); 
var next200 = limbs.Skip(200).Take(200); 
0

、しかしそうでないので、XSLTは仕事のためにはるかに優れたツールです。特にXSLT 2.0は、複数の出力ファイルを生成できるためです。 (C#環境で使用できる2つのXSLT 2.0プロセッサ、SaxonとXQSharpがあります)。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

<xsl:template match="/"> 
    <xsl:for-each-group select="//limb" group-adjacent="(position()-1) idiv 200"> 
    <xsl:result-document href="batch{position()}.xml"> 
     <batch> 
     <xsl:copy-of select="current-group()"/> 
     </batch> 
    </xsl:result-document> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 
+0

今日私はこれを打つつもりです。情報をありがとう、それは動作するように見えます。 – TheHorse1234

関連する問題