перебирая XML-файл, поддерживая уровни иерархии - PullRequest
0 голосов
/ 14 марта 2011

Я пытаюсь написать функцию для итерации моего xml-файла, а затем использовать найденные данные для создания моей древовидной диаграммы снова в dotnetcharting.

Например, если у меня есть следующее (ужасно, но только что сделаноup!) 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 голосов
/ 14 марта 2011

Я бы использовал рекурсию для этого.Лично у меня была бы функция, которая возвращает 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 будет закрыт и правильно расположен после выхода из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...