Visual Basic 8 (2005)DBAWebFormsVisual Studio 2005.NET 2.0XMLSQL Server 2005中级开发Visual StudioSQL ServerWindows.NETVisual BasicASP.NET
分层 XML 数据生成器






3.86/5 (4投票s)
一个数据生成器,它从 SQL 查询中以分层格式构建 XML。
引言
将分层数据绑定到菜单和树形控件是当今非常常见的任务。在需要时绑定子节点会产生服务器往返,或者使用递归绑定绑定数据会降低性能。我们可以使用这个生成器类以更简单的方式实现这些功能。
使用代码
HierarchicalXMLDataBuilder
类构建所需的 XML 数据。考虑 Employee 表的场景,该表有一个 ManagerId,它引用同一表的 EmployeeId。这个生成器将帮助处理此类场景。该方法 BuildMap
返回 XML 字符串作为输出。该方法参数为:
DataSet
- 标识列
- 引用列
- 键值
数据必须从数据库中获取一次,并作为参数传递给该方法。标识列和引用列是具有关系的列。键值是用于生成 XML 字符串的初始值。
Imports Microsoft.VisualBasic
Imports System.Xml
Imports System.Data
Public Class HierarchicalXMLDataBuilder
Private ParentColumn As String
Private ChildColumn As String
Private NoOfColumns As Integer
Private Data As DataSet
Private vuData As DataView
Public Function BuildMap(ByVal data As DataSet, _
ByVal IdentityColumn As String, ByVal ReferenceColumn As String, _
ByVal KeyValue As String) As String
Me.ParentColumn = IdentityColumn
Me.ChildColumn = ReferenceColumn
Me.Data = data
vuData = New DataView(data.Tables(0))
NoOfColumns = data.Tables(0).Columns.Count
Dim xml As String
xml = BuildChildNodes(vuData, ParentColumn & " = " & KeyValue)
Return xml
End Function
Private Function BuildChildNodes(ByVal vu As DataView, _
ByVal filter As String) As String
Dim nodeBuilder As New StringBuilder(String.Empty)
vu.RowFilter = filter
Dim RowCounter As Integer = 0
For RowCounter = 0 To vu.Count - 1
nodeBuilder.Append("<Node")
Dim ColCounter As Integer = 0
For ColCounter = 0 To NoOfColumns - 1
nodeBuilder.Append(" ")
nodeBuilder.Append(Data.Tables(0).Columns(ColCounter).ColumnName)
nodeBuilder.Append(" = """)
nodeBuilder.Append(vu.Item(RowCounter)(ColCounter).ToString())
nodeBuilder.Append(""" ")
Next
nodeBuilder.Append(" >")
Dim vuData2 As New DataView(data.Tables(0))
If vu.Count > RowCounter Then
nodeBuilder.Append(BuildChildNodes(vuData2, _
ChildColumn & " = " & _
vu.Item(RowCounter)(ParentColumn)))
End If
nodeBuilder.Append("</Node>")
Next
Return nodeBuilder.ToString()
End Function
End Class
我们可以像下面这样使用生成器。这将创建 XML 文件并将其保存在应用程序目录中。然后,我们可以将 XML 绑定到树形视图或菜单。
Dim XmlData As New HierarchicalXMLDataBuilder
Dim XmlString As String = XmlData.BuildMap(ds, "RowId", "ParentID", 1)
Dim doc As New System.Xml.XmlDocument()
doc.LoadXml(XmlString)
doc.Save(Server.MapPath("xmlfile.xml"))
HTML
<asp:treeview id="tv" runat="server" DataSourceID="XmlDataSource1" >
<DataBindings>
<asp:TreeNodeBinding DataMember="Node"
TextField="Data" ToolTipField="Data" />
</DataBindings>
</asp:treeview>
<asp:XmlDataSource ID="XmlDataSource1" runat="server"
DataFile="xmlfile.xml"></asp:XmlDataSource>
输出
ROWID DATA PARENTID
----------- ---------------------------------
1 MainMenuItem NULL
2 MenuItem1 1
3 MenuItem2 1
4 MenuItem3 1
5 MenuItem4 1
6 MenuItem11 2
7 MenuItem12 2
8 MenuItem13 2
9 MenuItem21 3
10 MenuItem22 3
11 MenuItem41 5
12 MenuItem42 5
13 MenuItem43 5
14 MenuItem121 7
15 MenuItem122 7
16 MenuItem123 7
17 MenuItem131 8
18 MenuItem132 8
19 MenuItem221 10
20 MenuItem222 10
21 MenuItem2221 20
22 MenuItem2222 20
23 MenuItem22221 22
24 MenuItem222211 23
25 MenuItem222212 23
如果数据看起来像这样,生成的 XML 文件将是:
<Node RowId="1" Data="MainMenuItem" ParentId="">
<Node RowId="2" Data="MenuItem1" ParentId="1">
<Node RowId="6" Data="MenuItem11" ParentId="2">
</Node>
<Node RowId="7" Data="MenuItem12" ParentId="2">
<Node RowId="14" Data="MenuItem121" ParentId="7">
</Node>
<Node RowId="15" Data="MenuItem122" ParentId="7">
</Node>
<Node RowId="16" Data="MenuItem123" ParentId="7">
</Node>
</Node>
<Node RowId="8" Data="MenuItem13" ParentId="2">
<Node RowId="17" Data="MenuItem131" ParentId="8">
</Node>
<Node RowId="18" Data="MenuItem132" ParentId="8">
</Node>
</Node>
</Node>
<Node RowId="3" Data="MenuItem2" ParentId="1">
<Node RowId="9" Data="MenuItem21" ParentId="3">
</Node>
<Node RowId="10" Data="MenuItem22" ParentId="3">
<Node RowId="19" Data="MenuItem221" ParentId="10">
</Node>
<Node RowId="20" Data="MenuItem222" ParentId="10">
<Node RowId="21" Data="MenuItem2221" ParentId="20">
</Node>
<Node RowId="22" Data="MenuItem2222" ParentId="20">
<Node RowId="23" Data="MenuItem22221" ParentId="22">
<Node RowId="24" Data="MenuItem222211" ParentId="23">
</Node>
<Node RowId="25" Data="MenuItem222212" ParentId="23">
</Node>
</Node>
</Node>
</Node>
</Node>
</Node>
<Node RowId="4" Data="MenuItem3" ParentId="1">
</Node>
<Node RowId="5" Data="MenuItem4" ParentId="1">
<Node RowId="11" Data="MenuItem41" ParentId="5">
</Node>
<Node RowId="12" Data="MenuItem42" ParentId="5">
</Node>
<Node RowId="13" Data="MenuItem43" ParentId="5">
</Node>
</Node>
</Node>