在 VS2005 中提供了很好的对 XML 的操作支持,下文将介绍如何使用 System.Xml 空间将数据绑定到 TreeView 控件。
本文适用于以具有 Visual Basic/C#/C++ 开发经验且了解 XML 的人士。
在向 TreeView 控件追加节点的时候可以使用 TreeNode 类,因为它直接表示一个节点,再添加时只需要将其与XML 文件的 XmlNode 类建立联系即可。本例使用一个名为 TreeView 的 treeView 控件和一个名为 students.xml 的 XML 文档。
[Visual Basic]
[C#]
[C++]
本文使用的 Xml 文件(students.xml)
本例适用于:安装有 .Net 2.0 运行库的 Windows Vista, Windows XP, Windows 2000, Windows Me, Windows 98
在向 TreeView 控件追加节点的时候可以使用 TreeNode 类,因为它直接表示一个节点,再添加时只需要将其与XML 文件的 XmlNode 类建立联系即可。本例使用一个名为 TreeView 的 treeView 控件和一个名为 students.xml 的 XML 文档。
[Visual Basic]
Imports
System.Xml
Public Class Form1 Class Form1
Private Sub Form1_Load()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()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
Public Class Form1 Class Form1
Private Sub Form1_Load()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()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;
}
}
}
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;
}
}
}
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>
<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