2009-08-24 16 views
0

私はちょうどLinqを学んでいて、私が望んでいるものはかなり単純です。だから私はその後、私は、クエリ上でforeachを実行Linqの特定の属性に基づいて特定の要素値を読み取りますか?

var query = from p in ILSXml.Elements("XDOC").Elements("ItemsDetail").Elements("Item") 
      select p; 

を照会、その後XDocument型に上記の私のXMLをロードし、

<?xml version="1.0" encoding="utf-8"?> 
<XDOC> 
    ... 
    <ItemsDetail> 
     <Item name="Item1"> 
      <data1> 
       <Data type="classA">55</Data> 
       <Data type="classB">66</Data> 
      </data1> 
      <data2> 
       <Data type="classA">77</Data> 
       <Data type="classB">88</Data> 
      </data2> 
     </Item> 
    </ItemsDetail> 
</XDOC> 

:私のXMLドキュメントは次のようです。だから、ライン

foreach (var record in query) 
{ 
    Console.WriteLine("Name: {0}", record.Attribute("Name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 
} 

Console.WriteLine("Data1 ClassA: {0}", record.Element("data1").Element("Data").Attribute("classA").Value); 

は、動作しませんが、私はかなり期待していたものです。別の一連のクエリを実行するか、インラインの匿名メソッドを実行する必要がありますか?

ああ、xmlにコメントしないでください。それは私のものではありません。私はちょうどそれを使用しなければなりません。

答えて

2

値55を取得しようとしているとしますか? Firstメソッドを使用して、 "typeA"属性値が "classA"である最初の "Data"要素を見つけることができます。

​​

上記の解決策はかなり壊れやすいことに注意してください。入力XML文書の構造を変更すると、null参照例外が発生する可能性があります。

さらにコンパクトなXPathクエリ言語を使用してXMLドキュメントをクエリできます。 XPathには、角括弧で囲まれた簡単な式を使用して要素をフィルタリングする機能があります。あなたのコードは、次のようになります。

foreach (var record in ILSXml.XPathSelectElements("XDOC/ItemsDetail/Item")) 
{ 
    Console.WriteLine("Name: {0}", 
     record.Attribute("name").Value); 
    Console.WriteLine("Data1 ClassA: {0}", 
     record.XPathSelectElement("data1/Data[@type='classA']").Value); 
} 
+0

これは、最初のものに似ていますが、.Firstがありません。 このようなxmlドキュメントを使用するより推奨される方法はありますか? –

+0

文書を記述するXSD(XMLスキーマ文書)を手に入れることができれば、実際のクラスを生成し、標準的なXML直列化を使用することには間違いありません。 –

関連する問題