2013-05-03 2 views
0

나는이 두 XMLS에서 동적으로 트리보기를 만들 필요가 Windows 응용 프로그램에서 트 리뷰 컨트롤을 만드는 : 부모 노드는 프로젝트 될 것이 XMLS를 읽으려면 및

첫째 XML에서와 자식 (즉, 노드의 텍스트입니다) 노드는 두 번째 XML의 전자 메일과 두 번째 XML의 경로가 첫 xml에 올 때까지 모든 폴더가됩니다.

정말 붙어 있나? XML이

XML 1: 
- <Projects> 
- <Project id="PROJ_1"> 
    <Name>Project A</Name> 
    <emailfile>D:\tree\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</emailfile> 
    </Project> 
- <Project id="PROJ_2"> 
    <Name>Project B</Name> 
    <emailfile>D:\tree\PEMS-Offline-Application\XMLFiles\PROJ_02_EMAILS.xml</emailfile> 
    </Project> 
- <Project id="PROJ_3"> 
    <Name>Project C</Name> 
    <emailfile>D:\tree\PEMS-Offline-Application\XMLFiles\PROJ_03_EMAILS.xml</emailfile> 
    </Project> 
    </Projects> 

:

- <root> 
- <Project id="PROJ_1"> 
- <folder id="F1.1"> 
- <incoming id="incoming"> 
- <emails> 
- <email ID="01.1"> 
    <subject>God Is Great</subject> 
    <to>[email protected]</to> 
    <cc>[email protected]</cc> 
    <emaildate>20/04/2013</emaildate> 
    <filepath>C:\currentProject\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</filepath> 
    </email> 
- <email ID="01.2"> 
    <subject>God</subject> 
    <to>[email protected]</to> 
    <cc>[email protected]</cc> 
    <emaildate>20/05/2013</emaildate> 
    <filepath>C:\currentProject\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</filepath> 
    </email> 
    </emails> 
    </incoming> 
- <outgoing id="outgoing"> 
- <emails> 
    <email ID="01.1" /> 
    <subject>God Is Great</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    <email ID="01.2" /> 
    <subject>God</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    <email ID="01.2" /> 
    <subject>hi</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    </emails> 
    </outgoing> 
    </folder> 
- <folder id="F1.2"> 
- <incoming id="incoming"> 
- <emails> 
- <email ID="01.1"> 
    <subject>God Is Great</subject> 
    <to>[email protected]</to> 
    <cc>[email protected]</cc> 
    <emaildate>20/04/2013</emaildate> 
    <filepath>C:\currentProject\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</filepath> 
    </email> 
- <email ID="01.2"> 
    <subject>God</subject> 
    <to>[email protected]</to> 
    <cc>[email protected]</cc> 
    <emaildate>20/05/2013</emaildate> 
    <filepath>C:\currentProject\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</filepath> 
    </email> 
    </emails> 
    </incoming> 
- <outgoing id="outgoing"> 
- <emails> 
    <email ID="01.1" /> 
    <subject>God Is Great</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    <email ID="01.2" /> 
    <subject>God</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    <email ID="01.2" /> 
    <subject>hi</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    </emails> 
    </outgoing> 
    </folder> 
- <folder id="F1.3"> 
- <incoming id="incoming"> 
- <emails> 
- <email ID="01.1"> 
    <subject>God Is Great</subject> 
    <to>[email protected]</to> 
    <cc>[email protected]</cc> 
    <emaildate>20/04/2013</emaildate> 
    <filepath>C:\currentProject\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</filepath> 
    </email> 
- <email ID="01.2"> 
    <subject>God</subject> 
    <to>[email protected]</to> 
    <cc>[email protected]</cc> 
    <emaildate>20/05/2013</emaildate> 
    <filepath>C:\currentProject\PEMS-Offline-Application\XMLFiles\PROJ_01_EMAILS.xml</filepath> 
    </email> 
    </emails> 
    </incoming> 
- <outgoing id="outgoing"> 
- <emails> 
    <email ID="01.1" /> 
    <subject>God Is Great</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    <email ID="01.2" /> 
    <subject>God</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    <email ID="01.2" /> 
    <subject>hi</subject> 
    \ 
    <to /> 
    <cc /> 
    <emaildate /> 
    <filepath /> 
    </emails> 
    </outgoing> 
    </folder> 
    </Project> 
    </root> 

답변

0

다음은 C#을 구현 한 것입니다. BackgroundWorker 스레드에서 작동하므로 사용하지 않으면 제거하십시오.

private void ConvertXmlNodeToTreeNode(BackgroundWorker worker, DoWorkEventArgs args, XmlNode xmlNode, TreeNodeCollection treeNodes) 
    { 
     TreeNode newTreeNode = null; 
     String nodeText = null; 

     if (worker.CancellationPending == true) 
     { 
      args.Cancel = true; 
      return; 
     } 

     Invoke((MethodInvoker)delegate 
     { 
      newTreeNode = treeNodes.Add(xmlNode.Name); 
     }); 

     switch (xmlNode.NodeType) 
     { 
      case XmlNodeType.ProcessingInstruction: 
      case XmlNodeType.XmlDeclaration: 
       nodeText = "<?" + xmlNode.Name + " " + xmlNode.Value + "?>"; 
       break; 
      case XmlNodeType.Element: 
       nodeText = "<" + xmlNode.Name + ">"; 
       break; 
      case XmlNodeType.Attribute: 
       nodeText = "ATTRIBUTE: " + xmlNode.Name; 
       break; 
      case XmlNodeType.Text: 
      case XmlNodeType.CDATA: 
       nodeText = xmlNode.Value; 
       break; 
      case XmlNodeType.Comment: 
       nodeText = "<!--" + xmlNode.Value + "-->"; 
       break; 
     } 
     if (!String.IsNullOrEmpty(nodeText)) 
     { 
      Invoke((MethodInvoker)delegate 
      { 
       newTreeNode.Text = nodeText; 
      }); 
     } 

     if (xmlNode.Attributes != null) 
     { 
      foreach (XmlAttribute attribute in xmlNode.Attributes) 
      { 
       ConvertXmlNodeToTreeNode(worker, args, attribute, newTreeNode.Nodes); 
      } 
     } 
     foreach (XmlNode childNode in xmlNode.ChildNodes) 
     { 
      ConvertXmlNodeToTreeNode(worker, args, childNode, newTreeNode.Nodes); 
     } 
    }