2017-08-22 21 views
0

私はこのかなり大きなXMLファイルを解析する必要があり、メモリ内のファイル全体をロードしたくありません。 XMLは次のようになります。大規模なXMLファイルでXMLreaderとxpathを使用するC#

<root> 
    <node attrib ="true"> 
     <child childattrib=1> 
     </child> 
    </node> 
    <node attrib ="false"> 
     <child childattrib=1> 
     </child> 
    </node> 
</root> 

nodeという名前の各ノードを調べ、その属性が自分のsearch-criteraと一致するかどうかを確認します。そして、私はそれをxpathを使ってやりたい。 私はParse xml in c# : combine xmlreader and linq to xmlを見つけました。問題のノードを分離するのに役立ちます。 しかし親ノードでxpathを使うことはできません。私はxmldocumentを作成して読み込みをしなければならないだろうと思っていますが、私が望むやり方で動作させることはできません。

答えて

1

属性は値(childattrib)を二重引用符で囲む必要があります。 xmlリーダーとxml linqの組み合わせを試してください。大きなxmlファイルを読むときは、常にxmlreaderを使用してください。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication74 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlReader reader = XmlReader.Create(FILENAME); 

      while (!reader.EOF) 
      { 
       if (reader.Name != "node") 
       { 
        reader.ReadToFollowing("node"); 
       } 
       if (!reader.EOF) 
       { 
        XElement node = (XElement)XElement.ReadFrom(reader); 
        if ((Boolean)node.Attribute("attrib")) 
        { 
        } 
       } 
      } 

     } 

    } 
} 
+0

これはすばらしい答えです。ありがとうございました!今、選択したノードに属性= "true"がある場合、xpath経由で検証することができます。私は試みました: var xpathval = node.XPathSelectElement( "node [@ attrib = 'true']")しかし、これは何も返しません – LimuxKingen

+0

私はコードを更新しました。 – jdweng

+0

@jdwengに関して、_大きなxmlファイルを読むときは常にxmlreader_を使用します。なぜこれはそうですか?私はXMLファイルを私の仕事の中で公正に扱い、その理由をここで知りたいと思っています。ありがとう! – Sach

関連する問題