65.9K
CodeProject 正在变化。 阅读更多。
Home

分层 XML 数据生成器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (4投票s)

2007年10月17日

CPOL

1分钟阅读

viewsIcon

27817

一个数据生成器,它从 SQL 查询中以分层格式构建 XML。

引言

将分层数据绑定到菜单和树形控件是当今非常常见的任务。在需要时绑定子节点会产生服务器往返,或者使用递归绑定绑定数据会降低性能。我们可以使用这个生成器类以更简单的方式实现这些功能。

使用代码

HierarchicalXMLDataBuilder 类构建所需的 XML 数据。考虑 Employee 表的场景,该表有一个 ManagerId,它引用同一表的 EmployeeId。这个生成器将帮助处理此类场景。该方法 BuildMap 返回 XML 字符串作为输出。该方法参数为:

  1. DataSet
  2. 标识列
  3. 引用列
  4. 键值

数据必须从数据库中获取一次,并作为参数传递给该方法。标识列和引用列是具有关系的列。键值是用于生成 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>
© . All rights reserved.