2011-03-14 29 views
0

我想写一个函数来迭代我的xml文件 - 然后使用发现的数据在dotnetcharting中再次生成我的树形图。迭代通过维护层次级别的xml文件

举例来说,如果我有以下的(可怕,但只是做了!)XML文件

<root> 
    <Player> 
     <firstname/> 
     <lastname/> 
    </Player> 

    <Team> 
     <Name/> 
      <Country> 
       <League> 
       </League> 
     </Country 
    </Team> 
</Root> 

那么这个想法是,我想有一个树形图在那里我有我的根节点,然后源于此我会有球员和球队。然后每个子节点,直到最后的最后节点将是数据。

XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml)); 
    while (rdr.Read()) 
    { 
    if (rdr.NodeType == XmlNodeType.Element) 
    { 
     Console.WriteLine(rdr.LocalName); 
    } 
    } 

我知道我可以这样写的XML文件,但我不保持任何形式的层次结构的,所以我不能告诉dotnetcharting什么什么的父节点的方法吗?

任何帮助?

回答

0

我会为此使用递归。我个人有一个返回TreeNode的函数,如果当前节点包含子元素节点然后调用本身,如:使用

static class XmlProcessor 
{ 

    public static TreeNode ProcessXml(XmlReader reader) 
    { 
     // Move to first element 
     while(reader.Read() && reader.NodeType != XmlNodeType.Element){} 
     return ParseNode(reader); 

    } 

    private static TreeNode ParseNode(XmlReader reader) 
    { 
     if (reader.NodeType == XmlNodeType.Text) return new TreeNode(reader.Value); 
     if (reader.IsEmptyElement) return new TreeNode(reader.Name); 

     TreeNode current = new TreeNode(reader.LocalName); 
     while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.Element) 
      { 
       current.Nodes.Add(ParseNode(reader)); 
      } 
      else if (reader.NodeType == XmlNodeType.EndElement) 
      { 
       return current; 
      } 
     } 
     return current; 
    } 

} 

这可以从应用程序调用:

TreeNode processedNodes = null; 
using (XmlReader reader = XmlReader.Create(new System.IO.StringReader(xml))){ 
    processedNodes = XmlProcessor.ProcessXml(reader); 
} 

using块确保XmlReader在超出范围时关闭并正确放置。