實習公司原來的左側菜單是通過js進行ajax請求一個xml文件得到一個xml對象,然後拼接html文件,現在需要從數據庫取數據生成xml,因爲保密關係,太詳細的不能放出來,簡單說下流程
1、C#後臺執行SQL,得到DataTable對象
2、變量DataTable對象,生成一個Dictionary,key就是主菜單,value就是這個主菜單包含的所有子菜單,是個ArrayList
3、變量這個Dictionary,根據每個key生成一個對象,這個對象的屬性是個List,List中包含的是子菜單的對象
4、序列化這些對象,生成xml,轉爲字符串傳給aspx
出於保密需要,我把問題抽象一下,這個xml可以用國家-省-城市來表達
從數據庫取出的數據差不多長這樣(這是多表join後的結果集):
id | province | city | address |
1 | 江蘇 | 南京 | nanjing |
2 | 浙江 | 杭州 | hangzhou |
3 | 浙江 | 寧波 | ningbo |
最後需要生成的xml長這樣:
<country width="200>
<province>
<city>
</province>
</country>
首先,定義類
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using IAUOperation.db;
using System.Collections;
using System.Data.SqlClient;
using Operation.Web;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
[XmlRoot("country")]
public class Country
{
[XmlAttribute]
public string width;
[XmlElement("province")]
public List<Province> provinces;
}
[XmlRoot("province")]
public class Province
{
[XmlAttribute]
public string name;
[XmlElement("city")]
public List<City> cities;
}
public class City
{
[XmlAttribute]
public string name;
[XmlAttribute]
public string address;
}
public class CityItem
{
public string province;
public string city;
public string address;
}
注意,這裏保存主菜單和子菜單的對應關係時,不能用Hashtable,因爲Hashtable是無序存儲的,而菜單是必須有順序的
這裏只給出了核心代碼作爲示例
DataTable dt = dbBase.executeInternalQuery(strSQL);
HashSet<string> hashSetMenus = new HashSet<string>();
Dictionary<string, ArrayList> provinceCity = new Dictionary<string, ArrayList>();
List<SubMenuItem> CityItemList = new List<SubMenuItem>();
for (int i = 0; i < dt.Rows.Count; i++)
{
string tmpProvince = dt.Rows[i]["province"].ToString();
hashSetProvinces.Add(tmpProvince);
CityItem cityItem = new SubMenuItem();
cityItem.province = tmpProvince;
cityItem.city = dt.Rows[i]["city"].ToString();
cityItem.address = dt.Rows[i]["address"].ToString();
CityItemList.Add(cityItem);
}
for (int i = 0; i < dt.Rows.Count; i++)
{
// 主菜單名
string tmpProvince = dt.Rows[i]["province"].ToString();
// 子菜單名
string tmpCity = dt.Rows[i]["city"].ToString();
if (hashSetProvinces.Contains(tmpMainMenu))
{
if (!provinceCity.ContainsKey(tmpMainMenu))
{
ArrayList citylist = new ArrayList();
citylist.Add(tmpSubMenu);
provinceCity.Add(tmpProvince, citylist);
}
else
{
ArrayList temp = provinceCity[tmpProvince] as ArrayList;
temp.Add(tmpCity);
}
}
}