2016-12-04 74 views
0

我想从XML文件中创建一个括号树。从C#中的XML文件创建一个括号树

在托架的匹配由四个小组。该团队的获胜者前进到下一轮。

如果比赛包括3支球队和一个孩子的比赛,那么孩子匹配决定第四小组父比赛。

这里是我的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