2011-12-14 21 views
0

現在、Webリクエストから私に返されたxmlからツリービューを取り込もうとしています。レスポンスはXMLは、このレイアウトであるように、私は、データを操作していますに来るとき:XMLからツリービューを取り込む

<GroupList> 
    <Group> 
     <GroupName>my first test group</GroupName> 
     <GroupID>djnsldgnljsdngljsdngljns</GroupID> 
     <AccessLevel>high</AccessLevel> 
     <SubGroup> 
      <SubGroupName>my first test subgroup</SubGroupName> 
      <SubGroupID>djnsldgnljsdngljsdngljns</SubGroupID> 
     </SubGroup> 
    </Group> 
    <Group> 
     <GroupName>my second test group</GroupName> 
     <GroupID>djnsldgnljsdngljsdngl</GroupID> 
     <AccessLevel>high</AccessLevel> 
     <SubGroup> 
      <SubGroupName>my second test subgroup</SubGroupName> 
      <SubGroupID>DBXRdjnsldgnljsdngljsdngl</SubGroupID> 
     </SubGroup> 
     <SubGroup> 
      <SubGroupName>my second test subgroup1</SubGroupName> 
      <SubGroupID>EJdjnsldgnljsdngljsdngl42</SubGroupID> 
     </SubGroup> 
    </Group> 
</GroupList> 

私がやりたいすべてのグループ名を表示し、あなたがサブグループを展開して表示することができますです。現在のところ、私はそれを "一種"の作業としていますが、そのすべてを一直線上に表示します。ここに私のコードで私は現在持っている:

xmlDoc.LoadXml(response2); 

    groupsTreeView.Nodes.Clear(); 
    groupsTreeView.Nodes.Add(new 
    TreeNode(xmlDoc.DocumentElement.InnerText)); 
    TreeNode tNode = new TreeNode(); 
    tNode = (TreeNode)groupsTreeView.Nodes[0]; 

    addTreeNode(xmlDoc.DocumentElement, tNode); 

    groupsTreeView.ExpandAll(); 

//This function is called recursively until all nodes are loaded 
    private void addTreeNode(XmlNode xmlNode, TreeNode treeNode) 
    { 
     XmlNode xNode; 
     TreeNode tNode; 
     XmlNodeList xNodeList; 
     if (xmlNode.HasChildNodes) //The current node has children 
     { 
      xNodeList = xmlNode.ChildNodes; 

      for (int x = 0; x <= xNodeList.Count - 1; x++) 
      //Loop through the child nodes 
      { 
       xNode = xmlNode.ChildNodes[x]; 
       groupsTreeView.Nodes.Add(new TreeNode(xNode.Value)); 
       tNode = groupsTreeView.Nodes[x]; 
       addTreeNode(xNode, tNode); 
      } 
     } 
     else //No children, so add the outer xml (trimming off whitespace) 
      treeNode.Text = xmlNode.OuterXml.Trim(); 
    } 

この画像は上記のコードは、ローカルに私のシステム上で閲覧するときのようになります。

enter image description here

任意の提案、イムかなり失われ、それはやっている私頭の中に!

答えて

2

あなたは、LINQのXML(System.Xml.Linq)を使用して、これを使用して試みることができる:

private TreeNode TNGroups(XElement xml) 
    { 
     TreeNode node = new TreeNode(); 
     foreach (XElement group in xml.Descendants("Group")) 
     { 
      TreeNode tnGroup = new TreeNode(group.Element("GroupName").Value); 
      node.Nodes.Add(tnGroup); 
      foreach (XElement subgroup in group.Elements("SubGroup")) 
      { 
       TreeNode tnSubGroup = new TreeNode(subgroup.Element("SubGroupName").Value); 
       tnGroup.Nodes.Add(tnSubGroup); 
      } 
     } 
     return node; 
    } 

あなたはこのmyTreeView.Nodes.Add(TNGroups(groupsXML))ようにそれを呼び出します。

XMLを要素にロードするには、XElement.Loadを使用してください。

+0

これは私のaddTreeNodeメソッドではなく、上記のコードをすべて置き換えることですか? – Sad

+0

これがあなたのコードを置き換えます。 –

+0

乾杯。私はXElement.Parseやnode.Nodes.Addの代わりにnode.ChildNodes.Addという小さな変更をいくつか行います。答えはありがたいですが、私に大きな助けになりました。ビッグ+1あなたのため: – Sad

0

Xmlファイルを移動するために再帰を正しく使用していますが、残念ながら各繰り返しでツリービューのルートにTreenodesを追加しています。ループ内で処理されるツリーノードに子ノードを追加するようにコードを変更してください(例:

for (int x = 0; x <= xNodeList.Count - 1; x++) 
    //Loop through the child nodes 
    { 
     xNode = xmlNode.ChildNodes[x]; 
     // Use the treenode, not the treeview!!! 
     treeNode.Nodes.Add(new TreeNode(xNode.Value)); 
     tNode = groupsTreeView.Nodes[x]; 
     addTreeNode(xNode, tNode); 
    } 
+0

こんにちは、treeNodeはTreeNodeクラスではありません。TreeNodeはツリービューではありません。私は 'treeNode.ChildNodes.Add(新しいTreeNode(xNode.Value));'を実行しました。どちらがうまくいくように見えますか?私は今、私の最初のグループと同じ正しい 'sam test group'のルート要素を持っていて、それは4つの空のチェックボックスを表示し、次に 'sam test group'をサブグループとして表示します。また、xmlの2番目のグループ要素も読み取られません。ダムのツリービュー、それはなぜそんなにかっこいいですか? – Sad

0

私はあなたの応答コードを使用し、属性と複雑な構造を持ついくつかのXMLが誤って表示されています。あなたのアイデアをすべてミックスしてください。あたかも誰かのために役立つかのように

private void populateBaseNodes(XmlDocument docXML) 
    { 
     tView.Nodes.Clear(); // Clear 
     tView.BeginUpdate(); 
     TreeNode treenode; 

     XmlNodeList baseNodeList = docXML.ChildNodes; 

     foreach (XmlNode xmlnode in baseNodeList) 
     { 
      string key = xmlnode.Name == null ? "" : xmlnode.Name.ToString(); 
      string value = xmlnode.Value == null ? xmlnode.Name.ToString() : xmlnode.Value.ToString(); 
      treenode = tView.Nodes.Add(key, value); // add it to the tree 

      if (xmlnode.Attributes.Count > 0) 
      { 
       foreach (XmlAttribute att in xmlnode.Attributes) 
       { 
        TreeNode tnode = new TreeNode(); 
        string _name = att.Name; 
        string _value = att.Value.ToString(); 
        tnode.Name= _name; 
        tnode.ForeColor = Color.Red; 
        tnode.Text= "<Attribute>:" +_name; 
        TreeNode _attvalue = new TreeNode(); 
        _attvalue.Name = _name; 
        _attvalue.Text = _value; 
        _attvalue.ForeColor = Color.Purple; 
        tnode.Nodes.Add(_attvalue); 
        treenode.Nodes.Add(tnode); 
       } 
      } 
      AddChildNodes(xmlnode, treenode); 
     } 
     tView.EndUpdate(); 
     tView.Refresh(); 
    } 

    private void AddChildNodes(XmlNode nodeact, TreeNode TreeNodeAct) 
    { 
     XmlNodeList ChildNodeList = nodeact.ChildNodes; 
     TreeNode aux = null; 

     if (nodeact.HasChildNodes) 
     { 
      //Recursive Call 
      foreach (XmlNode xmlChildnode in nodeact.ChildNodes) 
      { 
       //Add Actual Node & Properties 
       string Key = xmlChildnode.Name == null ? "" : xmlChildnode.Name.ToString(); 
       string Value = xmlChildnode.Value == null ? xmlChildnode.Name.ToString() : xmlChildnode.Value.ToString(); 

       aux = TreeNodeAct.Nodes.Add(Key, Value); 
       AddChildNodes(xmlChildnode, aux); 

       if (xmlChildnode.Attributes != null && xmlChildnode.Attributes.Count > 0) 
       { 
        foreach (XmlAttribute att in xmlChildnode.Attributes) 
        { 
         TreeNode tnode = new TreeNode(); 
         string _name = att.Name; 
         string _value = att.Value.ToString(); 
         tnode.Name = _name; 
         tnode.Text = "<Attribute>:" + _name; 
         tnode.ForeColor = Color.Red; 
         tnode.Text = "<Attribute>:" + _name; 
         TreeNode _attvalue = new TreeNode(); 
         _attvalue.Name = _name; 
         _attvalue.Text = _value; 
         _attvalue.ForeColor = Color.Purple; 
         tnode.Nodes.Add(_attvalue); 
         aux.Nodes.Add(tnode); 
        } 
       } 
      } 
     } 

    } 
1

私は何か似たものが必要でした。私はそれを修正してbferrerの答えに属性追加が好きで、クラスにそれを置く:

using System; 
using System.Text; 
using System.Xml; 
using System.Drawing; 
using System.Windows.Forms; 

namespace TreeViewTest 
{ 
    class XmlTreeViewBuilder 
    { 
     private XmlDocument xDoc; 
     private TreeView tView; 

     //Constructor with parameters 
     public XmlTreeViewBuilder(XmlDocument xDocument, TreeView treeView) 
     { 
      this.xDoc = xDocument; 
      this.tView = treeView; 
     } 

     public void getTreeView() 
     { 
      tView.Nodes.Clear();          //Clear out the nodes before building 
      XmlNode pNode = xDoc.DocumentElement;      //Set the xml parent node = xml document element 
      string Key = pNode.Name == null ? "" : pNode.Name;   //If null set to empty string, else set to name 
      string Value = pNode.Value == null ? Key : pNode.Value;  //If null set to node name, else set to value 
      TreeNode tNode = tView.Nodes.Add(Key, Value);    //Add the node to the Treeview, set tNode to that node 
      AddTreeNodes(pNode, tNode);         //Call the recursive function to build the tree 
     } 

     //Build out the tree recursively 
     private void AddTreeNodes(XmlNode currentParentNode, TreeNode currentTreeNode) 
     { 
      //Check to see if the node has attributes, if so add them 
      if (currentParentNode.Attributes != null && currentParentNode.Attributes.Count > 0) 
      { 
       foreach (XmlAttribute attrib in currentParentNode.Attributes) 
       { 
        //Create a node for the attribute name 
        TreeNode attribNode = new TreeNode(); 
        attribNode.Name = attrib.Name; 
        attribNode.ForeColor = Color.Red; 
        attribNode.Text = "<Attribute>:" + attrib.Name; 
        //treeNode adds the attribute node 
        currentTreeNode.Nodes.Add(attribNode); 

        //Create a node for the attribute value 
        TreeNode attribValue = new TreeNode(); 
        attribValue.Name = attrib.Name; 
        attribValue.ForeColor = Color.Blue; 
        attribValue.Text = attrib.Value; 
        //Attribute node adds the value node 
        attribNode.Nodes.Add(attribValue); 
       } 
      } 
      //Recursively add children, grandchildren, etc... 
      if (currentParentNode.HasChildNodes) 
      { 
       foreach (XmlNode childNode in currentParentNode.ChildNodes) 
       { 
        string Key = childNode.Name == null ? "" : childNode.Name; 
        string Value = childNode.Value == null ? Key : childNode.Value; 
        TreeNode treeNode = currentTreeNode.Nodes.Add(Key, Value); 
        //Recursive call to repeat the process for all child nodes which may be parents 
        AddTreeNodes(childNode, treeNode); 
       } 
      } 
     } 

    } 
} 

今私のフォームから、私は単にオブジェクトをインスタンス化し、getTreeViewを(呼び出す必要があります)ので、のように:

 XmlTreeViewBuilder tBuilder = new XmlTreeViewBuilder(xmlDoc, treeView1); 
     tBuilder.getTreeView(); 

getNode、setNodeなど、必要に応じてクラスに関数を追加できます。これが誰かを助けてくれることを願っています。

+0

おい、これは素晴らしいです! – NTDLS