C#序列化對象轉爲爲XML格式字符串

實習公司原來的左側菜單是通過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);

        }
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章