根据DataTable递归生成XML文件的例子
假如数据库中表 Table1 的字段分别如下:
id Name ParentId
1 爷爷 0
2 爸爸 1
3 叔叔 1
4 我 2
5 妹妹 2
6 堂弟 3
生成如下的 Xml 格式的文件,
XML/XHTML 代码
<family>
<fa id="1" name="爷爷" parent="0">
<fa id="2" name="爸爸" parent="1">
<fa id="4" name="我" parent="2" />
<fa id="5" name="妹妹" parent="2" />
</fa>
<fa id="3" name="叔叔" parent="1">
<fa id="6" name="堂弟" parent="3" />
</fa>
</fa>
</family>
<fa id="1" name="爷爷" parent="0">
<fa id="2" name="爸爸" parent="1">
<fa id="4" name="我" parent="2" />
<fa id="5" name="妹妹" parent="2" />
</fa>
<fa id="3" name="叔叔" parent="1">
<fa id="6" name="堂弟" parent="3" />
</fa>
</fa>
</family>
则可以采用下面的方法实现:
C# 代码
DataTable t = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
string xml = "";
SqlConnection cn = new SqlConnection("Data Source=(local);User ID=sa;Password=;Initial Catalog=pubs");
SqlDataAdapter sa = new SqlDataAdapter("select * from Table1", cn);
DataSet ds = new DataSet();
sa.Fill(ds);
t = ds.Tables[0];
xml = "<family>" + WriteXml("0"+ "</family>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(xml);
doc.Save(Server.MapPath("~/xxx.xml"));
}
String WriteXml(String ParentId)
{
string s = "";
//防止关键字,加[]
DataRow[] dv = t.Select("[ParentId]=" + ParentId);
for (int i = 0; i < dv.Length; i++)
{
if (dv[i].Table.Select("[ParentId] = " + dv[i]["id"]).Length > 0)
{
s += "<fa id='" + dv[i]["id"].ToString() + "' name='" + dv[i]["name"].ToString() + "' parent='" + dv[i]["ParentId"].ToString() + "'>";
s += WriteXml(dv[i]["id"].ToString()) + "</fa>";
}
else
{
s += "<fa id='" + dv[i]["id"].ToString() + "' name='" + dv[i]["name"].ToString() + "' parent='" + dv[i]["ParentId"].ToString() + "'/>";
}
}
return s;
}
protected void Page_Load(object sender, EventArgs e)
{
string xml = "";
SqlConnection cn = new SqlConnection("Data Source=(local);User ID=sa;Password=;Initial Catalog=pubs");
SqlDataAdapter sa = new SqlDataAdapter("select * from Table1", cn);
DataSet ds = new DataSet();
sa.Fill(ds);
t = ds.Tables[0];
xml = "<family>" + WriteXml("0"+ "</family>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(xml);
doc.Save(Server.MapPath("~/xxx.xml"));
}
String WriteXml(String ParentId)
{
string s = "";
//防止关键字,加[]
DataRow[] dv = t.Select("[ParentId]=" + ParentId);
for (int i = 0; i < dv.Length; i++)
{
if (dv[i].Table.Select("[ParentId] = " + dv[i]["id"]).Length > 0)
{
s += "<fa id='" + dv[i]["id"].ToString() + "' name='" + dv[i]["name"].ToString() + "' parent='" + dv[i]["ParentId"].ToString() + "'>";
s += WriteXml(dv[i]["id"].ToString()) + "</fa>";
}
else
{
s += "<fa id='" + dv[i]["id"].ToString() + "' name='" + dv[i]["name"].ToString() + "' parent='" + dv[i]["ParentId"].ToString() + "'/>";
}
}
return s;
}