2017-05-03 8 views
0

私は助けが必要です。C#読書xml特定のノード

<group id = "56"> 
 
<name>Counter</name> 
 
</group>
コードで

、同じパターンが戻ってくるmulitiple場所がある、と私は希望:私はこの1つのようにブラケットの内側に読み取るための方法を把握しようとしていますすべてのグループID番号とその名前を取得します。

これは私のコードです:

 XDocument doc = XDocument.Parse(_XmlFile); 
     var results = doc.Descendants("group").Select(x => new 
     { 
      id = (int)x.Attribute("id"), 
      name = x.Attribute("name").Value, 
     }).ToList(); 

     Console.WriteLine(results); 

おかげ

+0

名前は属性ではなく子ノード – flq

+0

です。1. 'XElement'を' int'にキャストできません。 'string'である' Value'を解析する必要があります。 2. 'name'は属性ではなく、' group'の子要素です。 –

+0

誰かがこれを訂正するのを助けることができますか? –

答えて

1

は、あなたのコードは非常にOKに見えますが、それは

XDocument doc = XDocument.Parse(_XmlFile); 
var results = doc.Descendants("group").Select(x => new 
{ 
    id = (int)x.Attribute("id"), 
    name = (string)x.Element("name"), 
}).ToList(); 

foreach (var x in results) 
    Console.WriteLine("id: {0} name: {1}", x.id, x.name); 
+0

誰か気になる人downvotesを説明するには? – derpirscher

+0

これは実際に動作しています。 –

0

使用getElementsByTagNameのでなければなりませんのでnameは、要素ではなく属性であります方法。

ここに例を示したMicrosoftの記事があります。 https://msdn.microsoft.com/en-us/library/dc0c9ekk(v=vs.110).aspx

+0

私はそれを使用すると、グループをdoc.GetElementsByTagName( "group")に入れたら、残りのすべてのXMLを返します。 –

0

"名前"は属性ではなく、子ノードです。解決策は次のようなものです:

XDocument doc = XDocument.Parse(_XmlFile); 
var results = doc.Descendants("group").Select(x => new 
{ 
    id = int.Parse(x.Attribute("id").Value), 
    name = x.Descendants("name").First().Value 
}).ToList(); 
+0

'int.Parse'パーツは必要ありませんが、' XAttribute'を 'int'にキャストし、' x.Element( "name") 'は第一の子要素を取得するより正確な方法です。 XElementさらに、 'x.Descendants'はすべての子孫レベルの子を取得します。おそらくこれは望ましくないかもしれません。子孫の 'name'がなければ、コードは例外をスローします – derpirscher

+0

ありがとうございます。私は投稿する前にあなたの答えを見なかった... :) –

関連する問題