2011-03-14 3 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가 닫히고 범위를 벗어나면 올바르게 처리되도록합니다.