2016-12-04 9 views
0

XMLファイルから括弧のツリーを作成しようとしています。C#のXMLファイルからブラケットツリーを作成する

ブラケットでの試合は4チームで構成されています。そのチームの勝者は次のラウンドに進む。

マッチが3つのチームと1つのマッチで構成されている場合、そのマッチでは、マッチの第4チームが決定されます。ここで

は私のXMLファイルである:ここで

<?xml version="1.0" encoding="utf-8" ?> 
    <Round> 
    <Match> 
     <Team id="A1">Apples</Team> 
     <Team id="B2">Banannas</Team> 
     <Team id="C3">Cantalopes</Team> 
     <Team id="D4">Durians</Team> 
    </Match> 
    <Match> 
     <Team id="A2">Avocados</Team> 
     <Team id="B2">Blueberry</Team> 
     <Team id="C3">Coconut</Team> 
     <Team id="TBD"> 
     <Match> 
      <Team id="A3">Apricots</Team> 
      <Team id="B5">Banannas</Team> 
      <Team id="C9">Cantalopes</Team> 
      <Team id="D6">Durians</Team> 
     </Match> 
     </Team> 
    </Match> 
    </Round> 

はツリーを作成するために私の関数である。

private void CreateTree(XmlTextReader reader, Node<Match<Team>> parent, Match<Team> currentMatch) 
    { 
     if (reader.Read()) 
     { 
      if (reader.IsStartElement()) 
      { 
       switch (reader.Name) 
       { 
        case "Match": //We need to make a new match! 
         currentMatch = new Match<Team>(); 
         Node<Match<Team>> child = new Node<Match<Team>>(currentMatch); 
         parent.Add(currentMatch); 
         CreateTree(reader, child, currentMatch); 
         break; 
        case "Team": //We need to add a team! 
         string id = reader.GetAttribute("id"); 
         if (id != "TBD") 
         { 
          string name = reader.Value; 
          currentMatch.Add(new Team(id, name)); 
         } 
         else 
         { 
          currentMatch.Add(Team.Tbd); 
         } 
         CreateTree(reader, parent, currentMatch); 
         break; 
        default: 
         break; 
       } 
      } 
      else 
      { 
       CreateTree(reader, parent.Parent, null); 
      } 
     } 
    } 

私が最初に次のようにこの関数を呼び出す:

string path = Path.Combine(Environment.CurrentDirectory, @"Data\", fileName); 
XmlTextReader reader = new XmlTextReader(path); 
CreateTree(reader, tree, null); 
reader.Close(); 

残念ながら、これは機能しません、私のツリーは空であり、私は間違って何をしているのか分かりません。これを理解する助けがあれば幸いです!

ありがとうございます!

+0

XML自体が木です。だから 'XElement.Load'はあなたに木を与えます。 –

答えて

0

は、次の試してみてください。

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      Node node = new Node(FILENAME); 
      node.Print(node, 1); 
      Console.ReadLine(); 
     } 
    } 
    public class Team 
    { 
     public string name { get; set; } 
     public string id { get; set; } 
    } 

    public class Node 
    { 
     public Node child = null; 
     public List<List<Team>> matches = new List<List<Team>>(); 

     public Node() 
     { 
     } 
     public Node(string filename) 
     { 
      XmlReader reader = XmlTextReader.Create(filename); 
      CreateTree(reader, this, false); 
     } 
     private void CreateTree(XmlReader reader, Node parent, Boolean isChild) 
     { 
      Boolean endElement = false; 
      while (!reader.EOF && !endElement) 
      { 
       if (!isChild) 
       { 
        reader.Read(); 
       } 
       isChild = false; 

       if (!reader.EOF) 
       { 
        switch (reader.NodeType) 
        { 
         case XmlNodeType.Element: 
          switch (reader.Name) 
          { 
           case "Match": //We need to make a new match 
            List<Team> match = new List<Team>(); 
            parent.matches.Add(match); 
            CreateTree(reader, parent, false); 
            break; 
           case "Team": //We need to add a team! 
            parent.matches.Last().Add(new Team() { 
             id = reader.GetAttribute("id"), 
             name = reader.ReadString().Trim() 
            }); 
            if (reader.Name == "Match") 
            { 
             parent.child = new Node(); 
             CreateTree(reader, parent.child, true); 
            } 
            break; 
           default: 
            break; 
          } 
          break; 
         case XmlNodeType.EndElement: 
          //break out of while loop 
          endElement = true; 
          break; 
        } 
       } 
      } 
     } 
     public void Print(Node node, int level) 
     { 
      foreach (List<Team> match in node.matches) 
      { 
       Console.WriteLine("{0} Match", new string(' ',5 * level)); 
       foreach (Team team in match) 
       { 
        Console.WriteLine("{0} Team : Name = '{1}', Id = '{2}'", new string(' ', (5 * level) + 3), team.name, team.id); 
       } 
      } 
      if (node.child != null) 
      { 
       Print(node.child, level + 1); 
      } 
     } 
    } 
} 
+0

ありがとう!それは動作するようです。それが動作していることを確認するために印刷する方法はありますか? – jmitten

+0

私はいくつかの改良を加え、印刷方法()を追加しました。 – jdweng

関連する問題