HOWTO:向 TreeView 控件中添加 XML 节点

在 VS2005 中提供了很好的对 XML 的操作支持,下文将介绍如何使用 System.Xml 空间将数据绑定到 TreeView 控件。 本文适用于以具有 Visual Basic/C#/C++ 开发经验且了解 XML 的人士。
在向 TreeView 控件追加节点的时候可以使用 TreeNode 类,因为它直接表示一个节点,再添加时只需要将其与XML 文件的 XmlNode 类建立联系即可。本例使用一个名为 TreeView 的 treeView 控件和一个名为 students.xml 的 XML 文档。

[Visual Basic]
Imports  System.Xml

Public 
Class Form1

    
Private 
Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TreeView.Nodes.Clear()
        
Dim doc As New
 XmlDocument
        doc.Load(
"students.xml"
)
        TreeView.Nodes.Add(
New
 TreeNode(doc.DocumentElement.Name))
        AddLstNodes(doc.DocumentElement, TreeView.Nodes(
0
))
        TreeView.ExpandAll()
    
End Sub


    
Private Sub AddLstNodes(ByVal node As XmlNode, ByVal tnode As TreeNode)
        
If node.HasChildNodes Then

            
Dim nodeLst As XmlNodeList = node.ChildNodes
            
For Each n As XmlNode In
 nodeLst
                
' 这里判断的是 XML 节点的名称,如果名称含有冒号,

                ' 那么 Prefix 属性表示冒号之前的部分,
                ' LocalName 属性表示之后的部分。
                ' GetAttribute(string name) 的 name 参数区分大小写。
                If n.Name = "SoftwareEngineering" OrElse n.Name = "Math" Then
                    
Dim e As XmlElement = n
                    tnode.Nodes.Add(
New TreeNode(n.Name + " From " +
 _
                        e.GetAttribute(
"year"+ " To " +
 _
                        e.GetAttribute(
"graduate"
)))
                
ElseIf n.Name = "Member" OrElse n.Name = "class" Then

                    
Dim e As XmlElement = n
                    tnode.Nodes.Add(
New TreeNode(n.Name + " id=" +
 _
                        e.GetAttribute(
"id"
)))
                
Else

                    tnode.Nodes.Add(
New TreeNode(n.Name))
                
End If

                AddLstNodes(n, tnode.LastNode)
            
Next
        
Else
            tnode.Text 
= node.Value
        
End If

    
End Sub


End Class

[C#]
using  System.Xml;

public partial class
 Form1 : Form
{
    
private void Form1_Load(object
 sender, EventArgs e)
    
{
        treeView.Nodes.Clear();
        XmlDocument doc 
= new
 XmlDocument();
        doc.Load(
"students.xml"
);
        treeView.Nodes.Add(
new
 TreeNode(doc.DocumentElement.Name));
        AddLstNodes(doc.DocumentElement, treeView.Nodes[
0
]);
        treeView.ExpandAll();
    }


    
private void AddLstNodes(XmlNode node, TreeNode tnode)
    
{
        
if
 (node.HasChildNodes)
        
{
            XmlNodeList nodeLst 
=
 node.ChildNodes;
            
foreach (XmlNode n in
 nodeLst)
            
{
                
/// <summary>
                
/// 这里判断的是 XML 节点的名称,如果名称含有冒号,
                
///
 那么 Prefix 属性表示冒号之前的部分,
                
///
 LocalName 属性表示之后的部分。
                
///
 GetAttribute(string name) 的 name 参数区分大小写。
                
/// </summary>

                switch (n.Name)
                
{
                    
case "SoftwareEngineering"
:
                    
case "Math"
:
                        tnode.Nodes.Add(
new TreeNode(n.Name + " From " +

                            ((XmlElement)n).GetAttribute(
"year"+ " To " +
                            ((XmlElement)n).GetAttribute(
"graduate")));
                        
break
;
                    
case "Member"
:
                    
case "class"
:
                        tnode.Nodes.Add(
new TreeNode(n.Name + " id=" +

                            ((XmlElement)n).GetAttribute(
"id")));
                        
break
;
                    
default
:
                        tnode.Nodes.Add(
new
 TreeNode(n.Name));
                        
break
;
                }

                AddLstNodes(n, tnode.LastNode);
            }

        }

        
else
        
{
            tnode.Text 
=
 node.Value;
        }

    }

}

[C++]
using namespace  System::Xml;

public ref class Form1 : public
 System::Windows::Forms::Form
{
    
private

        System::Void Form1_Load(System::Object
^  sender, System::EventArgs^  e) 
{
            TreeView
->Nodes->
Clear();
            System::Xml::XmlDocument
^ doc=
gcnew System::Xml::XmlDocument();
            doc
->Load("students.xml"
);
            treeView
->Nodes->Add(gcnew TreeNode(doc->DocumentElement->
Name));
            
this->AddLstNodes(doc->DocumentElement, treeView->Nodes[0
]);
            treeView
->
ExpandAll();
        }


        System::Void AddLstNodes(System::Xml::XmlNode
^ node, System::Windows::Forms::TreeNode^ tnode) {
            
if(node->
HasChildNodes)
            
{
                System::Xml::XmlNodeList
^ nodeLst = node->
ChildNodes;
                
for each(System::Xml::XmlNode^ n in
 nodeLst)
                
{
                    
/// <summary>
                    
/// 这里判断的是 XML 节点的名称,如果名称含有冒号,
                    
///
 那么 Prefix 属性表示冒号之前的部分,
                    
///
 LocalName 属性表示之后的部分。
                    
///
 GetAttribute(string name) 的 name 参数区分大小写。
                    
/// </summary>

                    if((n->Name=="SoftwareEngineering"|| (n->Name=="Math"))
                    
{
                        tnode
->Nodes->Add(gcnew TreeNode(n->Name + " From " +

                            ((System::Xml::XmlElement
^)n)->GetAttribute("year"+ " To " +
                            ((System::Xml::XmlElement
^)n)->GetAttribute("graduate")));
                    }

                    
else if ((n->Name=="Member"|| (n->Name=="class"))
                    
{
                        tnode
->Nodes->Add(gcnew TreeNode(n->Name + " id=" +

                            ((System::Xml::XmlElement
^)n)->GetAttribute("id")));
                    }

                    
else
                    
{
                        tnode
->Nodes->Add(gcnew TreeNode(n->
Name));
                    }

                    AddLstNodes(n, tnode
->LastNode);
                }

            }

            
else
            
{
                tnode
->Text=node->
Value;
            }

        }

}

本文使用的 Xml 文件(students.xml)
<?xml version="1.0" encoding="utf-8" ?>
<School>
    
<SoftwareEngineering year="2006" graduate="2010">
        
<class id="7">
            
<Member id="001">
                
<name>A</name>
            
</Member>
            
<Member id="002">
                
<name>B</name>
            
</Member>
        
</class>
        
<class id="8">
            
<Member id="003">
                
<name>C</name>
            
</Member>
            
<Member id="004">
                
<name>D</name>
            
</Member>
        
</class>
    
</SoftwareEngineering>
    
<Math year="2006" graduate="2010">
        
<class id="1">
            
<Member id="001">
                
<name>E</name>
            
</Member>
            
<Member id="002">
                
<name>F</name>
            
</Member>
        
</class>
    
</Math>
</School>

本例适用于:安装有 .Net 2.0 运行库的 Windows Vista, Windows XP, Windows 2000, Windows Me, Windows 98
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值