2016-10-29 4 views
2

私はlinqを使ってXML文書を読み込み、それをitemのリストに格納しようとしています。 "Item"という名前のクラスがあります。このクラスには "Effet"という別のクラスが含まれています。アイテムを作成することはできますが、「Effet」を初期化することはできません。 (いずれかがnullのままであるか、別のものを書き込もうとするとコンパイラエラーが発生します) 複数のものを試しましたが、何も働かなかった。ここで私が試したことがあります。ここで xmlと2つのクラスを持つlinq#

は私のコードである(現在はコメント):あなたはそこまでではありません

namespace RPGProject.Entity 
{ 
    public class Effet 
    { 
     public Monstre Cible { get; set; } 
     public Categorie Categorie { get; set; } 
     public int Magnitude { get; set; } 
     public int Duree { get; set; } 

     public Effet() 
     { 
      //this.Cible = null; 
      //this.Categorie = Categorie.Divers; 
      this.Magnitude = 0; 
      this.Duree = 0; 
     } 

    } 
} 

namespace RPGProject 
{ 
    public enum Categorie 
    { 
     Guérison, 
     Résurrection, 
     Attaque, 
     Stimulant, //Gain en force, énergie, etc 
     Divers //Orbe, sphère de capture 
    } 

    public class Item 
    { 
     public string Nom { get; set; } 
     public Effet Effet { get; set; } 
     public int Cout { get; set; } //$$$ 
     public int Ville { get; set; } 
     public int Rarete { get; set; } 

     public Item() {} 
     public Item(string nom) { this.Nom = nom; } 

     public Item(string nom, Effet effet, int cout, int ville) 
     { 
      this.Nom = nom; 
      this.Effet = new Effet(); 
      this.Cout = cout; 
      this.Ville = ville; 
     } 

     //Redéfinition afin de pouvoir comparer les items du dictionnaire 
     public override bool Equals(object obj) 
     { 
      var k = obj as Item; 
      if (k != null) 
      { 
       return this.Nom == k.Nom; 
      } 
      return base.Equals(obj); 
     } 

     //Redéfinition afin de pouvoir comparer les items du dictionnaire 
     public override int GetHashCode() 
     { 
      return this.Nom.GetHashCode(); 
     } 
    } 
} 

XMLファイル

<liste_item> 
    <item> 
     <nom>Seringue d'adrénaline</nom> 
     <effet> 
      <cible></cible> 
      <categorie>Résurrection</categorie> 
      <magnitude>0</magnitude> 
      <duree>1</duree> 
     </effet> 
     <categorie></categorie> 
     <cout>250</cout> 
     <ville>1</ville> 
    </item> 
</liste_item> 
+0

あなたが読もうとしているXMLのサンプルを –

+0

から投稿する必要があります。「編集リンクを共有」で追加しました。 – naghal

答えて

1

:XML読み 機能

//Charge les items du jeu dans une liste<Item> 
public static List<Item> chargerItems(string cheminFichier) 
{ 
    XElement xmlDoc = XElement.Load(cheminFichier); 

    List<Item> listeItem = (
     from i in xmlDoc.Elements("item") 
     select new Item() 
     { 
      Nom = (string)i.Element("nom").Value, 
      Cout = int.Parse(i.Element("cout").Value), 
      Ville = int.Parse(i.Element("ville").Value),     
      Effet = (from eff in i.Element("effet").Elements("effet") select new Effet { Duree = eff.Value}) 
       //  { 
       // Cible = null, 
       //Categorie = (Categorie)Enum.Parse(typeof(Categorie), (string)i.Element("categorie"))//, 
       // Magnitude = (int)i.Element("magnitude"), 
       // Duree = (int)i.Element("duree") 
     // } 
      //(

      // from eff in i.Elements("effet") 
      // select new Effet 

      // { 
      //  //Cible = (Monstre) eff.Element("cible"), 
      //  Categorie = (Categorie) Enum.Parse(typeof(Categorie), (string)eff.Element("categorie")), 
      //  Magnitude = (int)eff.Element("magnitude"), 
      //  Duree = (int)eff.Element("duree"), 

      // } 
      // ) as Effet 
     } 


     ).ToList(); 

    return listeItem; 
} 

私の二つのクラス

オフ。このようなあなたのLINQクエリを作ってみましょう:

List<Item> listeItem = (
    from i in xmlDoc.Elements("item") 
    let eff = i.Element("effet") 
    select new Item() 
    { 
     Nom = i.Element("nom").Value, 
     Cout = int.Parse(i.Element("cout").Value), 
     Ville = int.Parse(i.Element("ville").Value), 
     Effet = new Effet 
     { 
      Categorie = (Categorie)Enum.Parse(typeof(Categorie), eff.Element("categorie").Value), 
      Magnitude = int.Parse(eff.Element("magnitude").Value), 
      Duree = int.Parse(eff.Element("duree").Value) 
     } 
    }).ToList(); 
0

それは通常、このように、メソッドにサブオブジェクトの作成を考慮することができます:

private Effet GetEffet(XElement x) 
{ 
    var elEffet = x.Element("effet"); 
    return new Effet() 
    { 
     Duree = int.Parse(elEffet.Element("duree").Value), 
     Magnitude = int.Parse(elEffet.Element("magnitude").Value) 
    }; 
} 

これはあなたのタラのよりよい概要を説明しますLinqステートメントでは、また、メソッドでブレークポイントを設定できるので、後でコードをデバッグするときに役立ちます。

次のようなXMLを読むことができます:

var doc = XDocument.Load("XmlFile1.xml"); 
var listeItem = (from x in doc.Root.Elements("item") 
       select new Item(x.Element("nom").Value, 
       GetEffet(x), 
       int.Parse(x.Element("cout").Value), 
       int.Parse(x.Element("ville").Value))).ToList(); 

は、私はまた、Itemクラスのコンストラクタに小さな誤りを発見しました。代わりに新しいEffetオブジェクトを割り当てるので、私はあなたが、パラメータの値を代入するためのもの推測:

public Item(string nom, Effet effet, int cout, int ville) 
{ 
    this.Nom = nom; 
    this.Effet = effet; // Change this line 
    this.Cout = cout; 
    this.Ville = ville; 
} 

私は簡単のためにサンプルコードでいくつかのクラスとプロパティを残してきたことに注意してください。

0

お互いに感謝します。私はデバッグに役立つ方法を作るというアイデアが好きです。私はそれを行うことができるかどうかわかりませんでした。

どちらも私の問題を解決します。

関連する問題