迭代维护层次结构级别的xml文件

时间:2011-03-14 09:44:47

标签: c# xml charts

我正在尝试编写一个迭代我的xml文件的函数 - 然后使用找到的数据在dotnetcharting中再次生成我的树形图。

例如,如果我有以下(可怕的,但只是组成!)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什么是父节点?

任何帮助?

1 个答案:

答案 0 :(得分: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在超出范围时关闭并正确处理。