根据递归定义的数据表循环生成xml

数据库有数据表tbDept:

ID ParentID DeptName LevelID RoleID
1 0 软体研发处 0 0
2 1 软体研发一部 0 0
3 1 软体研发二部 0 0
4 1 软体研发三部 0 0
5 2 软体研发一部一课 0 0
6 2 软体研发一部二课 0 0
7 3 软体研发二部一课 0 0
8 3 软体研发二部一课 0 0
9 4 软体研发三部一课 0 0
10 4 软体研发三部二课 0 0
11 5 AAA 1 1
12 5 BBB 1 1
......

可以看出其中ID和ParentID是递归定义的,现在要生成如下形式的xml:

View Code
<root>
<node ID="1" ParentID="0" DeptName="软体研发处" LevelID="0" RoleID="0">
<node ID="2" ParentID="1" DeptName="软体研发一部" LevelID="0" RoleID="0">
<node ID="5" ParentID="2" DeptName="软体研发一部一课" LevelID="0" RoleID="0">
<node ID="11" ParentID="5" DeptName="AAA" LevelID="1" RoleID="1" />
<node ID="12" ParentID="5" DeptName="BBB" LevelID="1" RoleID="1" />
</node>
<node ID="6" ParentID="2" DeptName="软体研发一部二课" LevelID="0" RoleID="0" />
</node>
<node ID="3" ParentID="1" DeptName="软体研发二部" LevelID="0" RoleID="0">
<node ID="7" ParentID="3" DeptName="软体研发二部一课" LevelID="0" RoleID="0" />
<node ID="8" ParentID="3" DeptName="软体研发二部二课" LevelID="0" RoleID="0" />
</node>
<node ID="4" ParentID="1" DeptName="软体研发三部" LevelID="0" RoleID="0">
<node ID="9" ParentID="4" DeptName="软体研发三部一课" LevelID="0" RoleID="0" />
<node ID="10" ParentID="4" DeptName="软体研发三部二课" LevelID="0" RoleID="0" />
</node>
</node>
</root>

可以考虑先添加根元素root,然后用数据阅读器循环读取记录,每读一条就生成一个node元素,并将它添加到xml中指定元素的下面,做为其子元素。代码如下:

        XmlDocument xmlDoc = new XmlDocument();
XmlElement root = xmlDoc.CreateElement("root");
xmlDoc.AppendChild(root);
OleDbData md = new OleDbData();
md.ExecuteReader("select * from tbDept");
while (md.Reader.Read())
{
XmlElement node = xmlDoc.CreateElement("node");
for (int i = 0; i < md.Reader.FieldCount; i++)
node.SetAttribute(md.Reader.GetName(i), md.Reader[i].ToString());
int parentID = Convert.ToInt32(md.Reader["ParentID"]);
if (parentID > 0)
xmlDoc.SelectSingleNode(string.Format(@"//node[@ID='{0}']", parentID)).AppendChild(node);
else
xmlDoc.DocumentElement.AppendChild(node);
}
md.Close();
xmlDoc.Save(Server.MapPath("~/test.xml"));

以上代码使用了自己的数据库操作类OleDbData,是数据库操作代码形式更简练,读者可改写成原生ADO.NET代码,难度不大。

原文地址:https://www.cnblogs.com/dalmeeme/p/2433275.html