.NET解析xml字符串,經過反射給實體類對象賦值,獲取實體類數據列表

/// <summary>
        /// 解析xml字符串 轉換爲實體類列表數據
        /// </summary>
        /// <param name="xmlStr">xml字符串</param>
        /// <returns></returns>
        /// xml字符串格式以下:(Item的節點客戶有多對,每對錶明一條數據)
        /// <?xml version="1.0" encoding="utf-8" ?><BOSS><Item>
        /// <UserId>用戶編號</UserId>
        /// <Type>用戶類型</Type>
        /// <Group>用戶羣</Group>
        /// <State>用戶狀態</State>
        /// <SIM>SIM卡號</SIM>
        /// <STB>機頂盒號</STB>
        /// <Memo>備註</Memo>
        /// <Crtime>建立日期</Crtime>
        /// <CustomerId>客戶編號</CustomerId>
        /// <CustomerName>客戶名稱</CustomerName>
        /// <Address>用戶地址</Address>
        /// <Phone>電話</Phone>
        /// <Mobile>手機</Mobile>
        /// </Item><Code></Code><Msg></Msg></BOSS>
        public List<UserInfo> GetUserList(string xmlStr)
        {
            System.Type t = typeof(UserInfo);
            object obj = Activator.CreateInstance(t, null);//建立指定類型實例
            PropertyInfo[] fields = obj.GetType().GetProperties();//獲取指定對象的全部公共屬性

            List<UserInfo> ulist = new List<UserInfo>();
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(xmlStr);//加載xml
            XmlNodeList xlist = xml.GetElementsByTagName("Item");//獲取Item節點列表
            foreach (XmlNode xn in xlist)//遍歷Item節點下的子節點
            {

                object u = Activator.CreateInstance(t, null);//建立指定類型實例

                foreach (PropertyInfo p in fields)
                {
                    for (int i = 0; i < xn.ChildNodes.Count; )
                    {
                        if (xn.ChildNodes[i].Name == p.Name)
                        {
                            p.SetValue(u, xn.ChildNodes[i].InnerText, null);//給建立的實例屬性賦值
                        }
                        i++;
                    }
                }
                ulist.Add((UserInfo)u);
            }
            return ulist;
        }

 

或者將該方法寫爲一個通用的方法進行調用spa

 

/// <summary>
        /// 獲取一個實體類的object數據列表
        /// </summary>
        /// <param name="xmlStr">指定格式的xml字符串</param>
        /// <param name="t">實體類的發射類對象</param>
        /// <returns>實體類的object數據類別</returns>
        /// 不可直接將數據類別轉換爲實體類的真正類型數據列表,轉換時,需遍歷沒有object逐個轉換爲實體類型,而後附加到List
        public List<object> GetObjectList(string xmlStr, Type t)
        {
            List<object> olist = new List<object>();
            object obj = Activator.CreateInstance(t, null);//建立指定類型實例
            PropertyInfo[] fields = obj.GetType().GetProperties();//獲取指定對象的全部公共屬性

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(xmlStr);//加載xml
            XmlNodeList xlist = xml.GetElementsByTagName("Item");//獲取Item節點列表
            foreach (XmlNode xn in xlist)//遍歷Item節點下的子節點
            {

                object u = Activator.CreateInstance(t, null);//建立指定類型實例

                foreach (PropertyInfo p in fields)
                {
                    for (int i = 0; i < xn.ChildNodes.Count; )
                    {
                        if (xn.ChildNodes[i].Name == p.Name)
                        {
                            p.SetValue(u, xn.ChildNodes[i].InnerText, null);//給建立的實例屬性賦值
                        }
                        i++;
                    }
                }
                olist.Add(u);
            }
            return olist;
        }

 

 

string xmlStr="指定格式的xml字符串";code

System.Type t=typeof(實體類);xml

List<object> olist=GetObjectList(xmlStr,t);對象

List<實體類> list=new List<實體類>blog

然而此處存在一個問題,就是獲取的只是object類的數據列表,而且List<object> 是沒法轉換爲 List<實體類> 的,這時候咱們能夠經過遍歷的形式進行轉換utf-8

foreach(object o in olist)字符串

{string

  list.Add((實體類)o);io

}class

相關文章
相關標籤/搜索