2012-02-07 15 views
6

これは、XMLファイルから値のセットをロードし、格納するクラスに配置します。リストボックスに値を出力する方法を理解しようとしています。リストに格納された値のクラスを出力する

私は、ToList()メソッドのような簡単な方法があると思ったり、クラスの文字列(public GetEnumerator)をforeachすることができると思いました。私は、Foreachが複雑さのいくつかを隠しているが、私がしたいことをすることではないことを知ることができました。

私は(多分正しい用語を欠く)無駄をオンラインで検索してきた、残念ながら私は仕事で私のC#の参考図書を左:/

くらい、 感謝を正しい方向へのポインタをお願い申し上げます。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Xml; 

namespace ThereIsOnlyRules 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      listBox1.Items.Clear(); 

      string path = "characterXML.xml"; 
      FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
      System.Xml.XmlDocument CXML = new System.Xml.XmlDocument(); 

      CXML.Load(fs); 

      //Get the number of elements 
      XmlNodeList elemList = CXML.GetElementsByTagName("unit"); 

      //foreach (var element in elemList) 
      //{ 
      // listBox1.Items.Add(element); 
      //} 

      for (int i = 0; i < elemList.Count; i++) 
      { 
       UnitAttributes attributes = new UnitAttributes(); 

       attributes.army = elemList[i].Attributes["army"].Value; 
       attributes.category = elemList[i].Attributes["category"].Value; 
       attributes.type = elemList[i].Attributes["type"].Value; 
       attributes.composition = elemList[i].Attributes["composition"].Value; 
       attributes.WS = elemList[i].Attributes["WS"].Value; 
       attributes.BS = elemList[i].Attributes["BS"].Value; 
       attributes.T = elemList[i].Attributes["T"].Value; 
       attributes.W = elemList[i].Attributes["W"].Value; 
       attributes.I = elemList[i].Attributes["I"].Value; 
       attributes.A = elemList[i].Attributes["A"].Value; 
       attributes.LD = elemList[i].Attributes["LD"].Value; 
       attributes.save = elemList[i].Attributes["Save"].Value; 
       attributes.armour = elemList[i].Attributes["armour"].Value; 
       attributes.weapons = elemList[i].Attributes["weapons"].Value; 
       attributes.specialrules = elemList[i].Attributes["specialrules"].Value; 
       attributes.transport = elemList[i].Attributes["transport"].Value; 
       attributes.options = elemList[i].Attributes["options"].Value; 

       //foreach (string item in attributes) 
       //{ 

        //unit.Add(item); 
       //} 
       //listBox1.Items.AddRange(attributes) 

      } 

      //Close the filestream 
      fs.Close(); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
} 
} 

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

namespace ThereIsOnlyRules 
{ 
class UnitAttributes 
{ 
    public string army { get; set; } 
    public string category { get; set; } 
    public string type { get; set; } 
    public string composition { get; set; } 
    public string WS { get; set; } 
    public string BS { get; set; } 
    public string T { get; set; } 
    public string W { get; set; } 
    public string I { get; set; } 
    public string A { get; set; } 
    public string LD { get; set; } 
    public string save { get; set; } 
    public string armour { get; set; } 
    public string weapons { get; set; } 
    public string specialrules { get; set; } 
    public string transport { get; set; } 
    public string options { get; set; } 
    } 
} 

<?xml version="1.0"?> 
<config> 
<unit 
army="Tyranids" 
category="Troops" 
type="Infantry" 
composition="10-30" 
WS="3" 
BS="3" 
T="3" 
W="1" 
I="4" 
A="1" 
LD="6" 
Save="6+" 
armour="Chitin" 
weapons="Claws and Teeth, Fleshborer" 
specialrules="Instictive Behaviour - Lurk, Move Through Cover" 
transport="If the brood consists of 20 models or less, it may take a Mycetic Spore." 
options="Strangleweb, Spinefists, Spike rifle, Devourer, Adrenal Glands, Toxin Sacs" 
> 
Termagant Brood 
</unit> 
<unit 
army="Tyranids" 
category="Troops" 
type="Infantry" 
composition="10-30" 
WS="3" 
BS="3" 
T="3" 
W="1" 
I="5" 
A="2" 
LD="6" 
Save="6+" 
armour="Chitin" 
weapons="Scything Talons" 
specialrules="Instictive Behaviour - Feed, Bounding Leap, Fleet, Move Through Cover" 
transport="If the brood consists of 20 models or less, it may take a Mycetic Spore." 
options="Adrenal Glands, Toxin Sacs" 
> 
Hormagaunt Brood 
</unit> 
</config> 
+1

'XmlNodeList'は' IEnumerable'を実装しているので、 'foreach'が動作するはずです。 – svick

答えて

3

クラスフィールドまたはプロパティのメンバーはありますか?いずれにせよ、少しのリフレクションとLinqは、XMLファイルからインスタンスを水和した後、クラスのデータメンバーを列挙できるようにする必要があります。

var fieldDictionary = 
    (from f in typeof(UnitAttributes).GetFields() 
    select new {Name = f.Name, Value = (string)(f.GetValue(attributes))}) 
    .ToDictionary(x=>x.Name, x=>x.Value); 

fieldDictionaryは今リストボックスにロードに適していなければならない、(IEnumerable<KeyValuePair<string, string>>ある)Dictionary<string, string>

ご連絡ください。反射は遅いです。 UnitAttributesクラスを修正または拡張してIEnumerable(おそらくタプル、おそらくKeyValuePair)を実装する方がはるかに望ましいでしょう。また、定義されている順序ではなく、フィールド名のような他のFieldInfo/PropertyInfoデータによって、クラスのインスタンスのプロパティを必要な順序で正確に列挙できます。

また、フィールドはプロパティではなく、その逆もあります。クラスにプロパティとパブリックフィールドが混在している場合、どちらか一方に標準化することを強く推奨します。さもなければ、上記のLinqステートメントのうちの2つを使用してプロパティのリストとフィールドのリストの両方を反映させる必要があります(実行時間の約2倍のコストで)。カスタム定義されている可能性はありません注文。

2

シリアライザXmlSerializerのように使用して、オブジェクトの文字列への変換/文字列からの変換を処理する場合は、多くの時間と労力を省きます。このタイプのコードを最初から書く必要はありません。

+0

合意しましたが、質問の要点は、XMLではなく、オブジェクト形式のデータをどのように列挙するかということです。 – KeithS

+0

私はまだ言われて感謝し、私はちょうど同じような何かを他の場所で読んでいるでしょう。 – Amicable

関連する問題