2016-11-23 51 views
0

我正在尋找輸出列表,我通常會爲每個循環執行一個列表,並調出列表,如下面的代碼所示。控制檯希望我糾正它,但不會顯示爲參考爲空。 感謝您的幫助在主靜態列表上顯示班級列表void

class Program 
{ 
    const string FILENAME = @"royalTreeResults.xml"; 
    // THIS SECTION OF CODE IS WHAT IT SUGGESTS private static readonly IEnumerable<Family> families; 

    static void Main(string[] args) 
    { 
     XDocument doc = XDocument.Load(FILENAME); 
     Tree tree = new Tree(); 
     tree.families = doc.Descendants("family").Select(x => new Family() 
     { 
      FamilyName = (string)x.Element("name"), 
      FamilyTotalReign = (int)x.Element("totalReign"), 
      People = x.Elements("person").Select(y => Person.Recursive(y)).ToList() 
     }).ToList(); 
     foreach(Family per in families) // <--- THE ERROR IS HERE 
     { 
      Console.WriteLine(per.FamilyName + " " + per.FamilyTotalReign + " " + per.People); 
     } 
    } 
} 
public class Family 
{ 
    public string FamilyName { get; set; } 
    public int FamilyTotalReign { get; set; } 
    public List<Person> People { get; set; } 
} 
public class Person 
{ 
    public int? PersonBorn { get; set; } 
    public int? PersonCoronation { get; set; } 
    public int? PersonDied { get; set; } 
    public string PersonName { get; set; } 
    public int? PersonYinPower { get; set; } 
    public List<Person> Children { get; set; } 

    public static Person Recursive(XElement person) 
    { 
     Person newPerson = new Person(); 
     newPerson.PersonName = (string)person.Element("name"); 
     newPerson.PersonYinPower = (int?)person.Element("yearsInpower"); 
     newPerson.PersonBorn = (int?)person.Element("born"); 
     newPerson.PersonDied = (int?)person.Element("died"); 
     newPerson.PersonCoronation = (int?)person.Element("coronation"); 
     if (person.Element("children") != null) 
     { 
      newPerson.Children = person.Element("children").Elements("person").Select(y => Person.Recursive(y)).ToList(); 
     } 
     return newPerson; 
    } 
} 
public class Tree 
{ 
    public List<Family> families = new List<Family>(); 
} 

將.xml的樣品低於,但我知道這是不是問題

<?xml version="1.0" encoding="utf-8"?> 
 
<royaltree> 
 
    <family> 
 
    <name>Wessex</name> 
 
    <totalReign>137</totalReign> 
 
    <person> 
 
     <name>Alfred the Great</name> 
 
     <yearsInpower>28</yearsInpower> 
 
     <born>849</born> 
 
     <died>899</died> 
 
     <coronation>871</coronation> 
 
     <children> 
 
     <person> 
 
      <name>Edward the Elder</name> 
 
      <yearsInpower>25</yearsInpower> 
 
      <born>879</born> 
 
      <died>924</died> 
 
      <coronation>899</coronation> 
 
      <children> 
 
      <person> 
 
       <name>Edmund I the Elder</name> 
 
       <yearsInpower>6</yearsInpower> 
 
       <born>939</born> 
 
       <died>946</died> 
 
       <coronation>940</coronation> 
 
       <children> 
 
       <person> 
 
        <name>Edger the Peaceful</name> 
 
        <yearsInpower>16</yearsInpower> 
 
        <born>944</born> 
 
        <died>975</died> 
 
        <coronation>959</coronation> 
 
        <children> 
 
        <person> 
 
         <name>Ethelred II</name> 
 
         <yearsInpower>38</yearsInpower> 
 
         <born>962</born> 
 
         <died>1016</died> 
 
         <coronation>978</coronation> 
 
         <children> 
 
         <person> 
 
          <name>Edward Confessor</name> 
 
          <yearsInpower>24</yearsInpower> 
 
          <born>1002</born> 
 
          <died>1066</died> 
 
          <coronation>1042</coronation> 
 
         </person> 
 
         <person> 
 
          <name>Edward II Ironside</name> 
 
          <yearsInpower>0</yearsInpower> 
 
          <born>1002</born> 
 
          <died>1016</died> 
 
          <coronation>1016</coronation> 
 
         </person> 
 
         </children> 
 
        </person> 
 
        </children> 
 
       </person> 
 
       </children> 
 
      </person> 
 
      </children> 
 
     </person> 
 
     </children> 
 
    </person> 
 
    </family> 
 
    <family> 
 
    <name>Norman</name> 
 
    <totalReign>69</totalReign> 
 
    <person> 
 
     <name>William I</name> 
 
     <yearsInpower>21</yearsInpower> 
 
     <born>1028</born> 
 
     <died>1087</died> 
 
     <coronation>1066</coronation> 
 
     <children> 
 
     <person> 
 
      <name>Adela</name> 
 
      <born>1050</born> 
 
      <died>1080</died> 
 
     </person> 
 
     <person> 
 
      <name>William II</name> 
 
      <yearsInpower>13</yearsInpower> 
 
      <born>1056</born> 
 
      <died>1100</died> 
 
      <coronation>1087</coronation> 
 
     </person> 
 
     <person> 
 
      <name>Henry I Beauclerc</name> 
 
      <yearsInpower>35</yearsInpower> 
 
      <born>1068</born> 
 
      <died>1135</died> 
 
      <coronation>1100</coronation> 
 
      <children> 
 
      <person> 
 
       <name>Matilda</name> 
 
       <born>1130</born> 
 
       <died>1167</died> 
 
      </person> 
 
      </children> 
 
     </person> 
 
     </children> 
 
    </person> 
 
    </family>

+0

不清楚你在問什麼。想知道如何創建一個列表與元素在一個單線? – mmcrae

+0

沒有遺憾的混亂,我創建了列表公衆名單家庭=新列表();如代碼的最後幾行所示,我想輸出這個列表。 –

+0

我們可以顯示你的xml文檔的結構嗎?例如,有一個或兩個家庭的完整樣本? – alainlompo

回答

0

我不知道如果我你是對的。但我希望這可能會有所幫助:

static void Main(string[] args) 
{ 
    //... your stuff 

    //Iterate through families in tree 
    foreach (Family per in tree.families) 
    { 
     //Show the family info 
     Console.WriteLine(per.FamilyName + " " + per.FamilyTotalReign); 

     //Show the members recursively 
     ShowPeopleRecursive(per.People, 1); 
    } 
} 

//Shows the people tree. 
private static void ShowPeopleRecursive(List<Person> people, int level) 
{ 
    const string indent = ""; 
    foreach (var p in people) 
    { 
     Console.WriteLine($"{indent.PadLeft(level, ' ')} {p.PersonName} ({p.PersonBorn} - {p.PersonDied}). Years in power: {p.PersonYinPower}"); 

     if (p.Children != null) 
      ShowPeopleRecursive(p.Children, level + 1); 
    } 
} 

您遍歷樹中的家庭,然後遞歸地打印人員(及其子)。你應該看到:

Families

希望這有助於!

+1

這正是我所期待的,謝謝你的幫助 –

0

所以你必須循環你的人名單如下。

foreach (Family per in tree.families) // <--- THE ERROR IS HERE 
{ 
      Console.WriteLine(per.FamilyName + " " + per.FamilyTotalReign); 
      foreach (var ppl in per.People) 
      { 
       Console.WriteLine(ppl.PersonName + " " + per.FamilyName); 
      } 
} 

但我想建議您使用XmlSerializer的,你可以反序列化的XML,以便object.This是更簡潔的方法。如果你想要示例代碼讓我知道。