2010-12-15 17 views
2

私は約100MBの大規模なXML文書を持っています。このドキュメントでは、2つのタグの属性を見つける必要があります。大きなXML文書の特定の属性を見つける

XmlDocument xmlDocument = new XmlDocument (); 
xmlDocument.Load ("C:\\myxml.xml"); 

XmlNode node1 = xmlDocument.SelectSingleNode ("/data/objects[@type='data type 1']"); 
if (null != node1) 
{ 
    result = node1 [ "Version" ].Value; 
} 

をしかし、そうすることは200メガバイトの周りに取るように見える全体をメモリにXMLをロードします:私は、次のようなコードを使用することによってこれを行うことができます。とにかく私はこれをより効率的にすることができますか?

編集:今すぐ使用するコードを書いたXmlTextReaderを使用して素敵な回答がたくさんあります。 (それはより多くのメモリ効率的ですが、醜い:)。

+0

私はあなたのためのXmlReaderベースの例を投稿することができ、私はあなたが使用している.NETのバージョンを知っている必要があります。 – TToni

+0

私は.Net 3.5を使用しています – Kyle

答えて

4

実際には1つの値しか必要ないので、SAXはDOMより優れています。 .NET FrameworkのSAX実装はXmlTextReaderです。

+0

+1:XmlTextReaderは素晴らしいです(Zenoxの場合、XmlTextReaderは抽象クラスであるXmlReaderの実装です)) – LaGrandMere

3

XmlReaderを使用するようにしてください。

MSDN

より:

SAXリーダ同様、XMLReaderが前方専用、読み取り専用のカーソルです。これは、入力に対する高速の非キャッシュ・ストリーム・アクセスを提供します。ストリームまたはドキュメントを読み取ることができます。ユーザーはデータをプルすることができ、アプリケーションに関心のないレコードはスキップすることができます。大きな違いは、SAXモデルがパーサーがアプリケーションにイベントをプッシュし、新しいノードが読み取られるたびにアプリケーションに通知する「プッシュ」モデルであり、XmlReaderを使用するアプリケーションがリーダーからノードを引き出すことができるということです意志。

here

+0

+1。関連情報を引用する場合は**、例も**とします。 – Aliostad

1

これを行うには、XmlReaderクラスを使用できます。あなたのコードと同じには上記のようになりますんシンプルですが作業例:

string result = null; 

using (var reader = XmlReader.Create(@"c:\\myxml.xml")) 
{ 
    while (reader.Read()) 
    { 
     if (reader.NodeType == XmlNodeType.Element 
      && reader.Depth == 1 
      && reader.LocalName == "objects" 
      && reader.GetAttribute("type") == "data type 1") 
     { 
      result = reader.GetAttribute("Version"); 
      break; 
     } 
    } 
} 
関連する問題