获取xml节点名称动态赋给类的属性

sjylove 2010-01-08 03:35:28

xml文件内容


<?xml version="1.0" encoding="utf-8" ?>
<Connection>
<DataBase>myDataBase</DataBase>
<PassWord>myPassWord</PassWord>
<UserID>myUserID</UserID>
<Server>myServer</Server>
</Connection>




现有实体类

class Conn
{
private string dataBase;

public string DataBase
{
get { return dataBase; }
set { dataBase = value; }
}
private string passWord;

public string PassWord
{
get { return passWord; }
set { passWord = value; }
}
private string userID;

public string UserID
{
get { return userID; }
set { userID = value; }
}
private string server;

public string Server
{
get { return server; }
set { server = value; }
}

}





解析xml并给类属性动态赋值代码

class XmlOperate
{
static void Main(string[] args)
{
XmlDocument xd = new XmlDocument();
xd.Load("../../MyXml.xml");
XmlNodeList list = xd.ChildNodes;
Conn con = new Conn();
Test test = new Test();
Type type = con.GetType();
foreach (XmlNode var in list)
{
ReadXmlAndInitClass(var,type);
}
Console.WriteLine("DataBase:"+con.DataBase);

Console.ReadLine();
}

static void ReadXmlAndInitClass(XmlNode node,Type type)
{
if (node.ChildNodes.Count == 1)
{
string name = node.Name;
string value = node.Value;
PropertyInfo[] infos = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo pi in infos)
{
if (pi.Name == name)
pi.SetValue(pi.PropertyType, value, null);

Console.WriteLine("xmlName:" + name +" xmlValue: "+value + " PropertiesName= " + pi.Name);
}
}
else
{
XmlNodeList list = node.ChildNodes;
foreach (XmlNode var in list)
{
ReadXmlAndInitClass(var, type);
}
}
}
}



存在的问题:
1、无法获取xml节点名称
2、属性的setValue()方法参数搞不定

请大家帮忙
...全文
363 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
quansui 2010-01-08
  • 打赏
  • 举报
回复
用Spring比较好吧
chxg99 2010-01-08
  • 打赏
  • 举报
回复
关注
h_w_king 2010-01-08
  • 打赏
  • 举报
回复
一般利用序列化来解决。
kensouterry 2010-01-08
  • 打赏
  • 举报
回复
我顶一下好了!
sjylove 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 h_w_king 的回复:]
Lz,你的反射用的不对。
改了改,你参考一下,这里只是对类的属性进行了反射赋值,如果是对字段,则要用GetField(....)

static void Main(string[] args)
        {
            XmlDocument xd = new XmlDocument();
            xd.Load("../../MyXml.xml");
            XmlElement list = xd.DocumentElement;
            Conn con = new Conn();
            //Test test = new Test();
            //Type type = con.GetType();
            foreach (XmlNode var in list.ChildNodes)
            {
                ReadXmlAndInitClass(var,con);
            }
            Console.WriteLine("DataBase:"+con.DataBase);

            Console.ReadLine();
        }


void ReadXmlAndInitClass(XmlNode node, Object obj)
        {
            if (node.ChildNodes.Count == 1)
            {
                string name = node.Name;
                string value = node.InnerText;
                PropertyInfo p= obj.GetType().GetProperty(name);
                if (p != null)
                    p.SetValue(obj, value, null);
            }
            else
            {
                string name = node.Name;
               
                PropertyInfo p = obj.GetType().GetProperty(name);
                if (p != null)
                {
                    object oo = Activator.CreateInstance(p.PropertyType);
                    foreach (XmlNode var in node.ChildNodes)
                    {
                        ReadXmlAndInitClass(var, oo);
                    }
                    p.SetValue(obj, oo, null);
                }
            }
        }
[/Quote]

谢谢h_w_king
大家对于通用的此类问题,有什么好的解决方案么?请大家提出来 我指的是通用的解决方案,并非针对我的这个问题
h_w_king 2010-01-08
  • 打赏
  • 举报
回复
Lz,你的反射用的不对。
改了改,你参考一下,这里只是对类的属性进行了反射赋值,如果是对字段,则要用GetField(....)

static void Main(string[] args)
{
XmlDocument xd = new XmlDocument();
xd.Load("../../MyXml.xml");
XmlElement list = xd.DocumentElement;
Conn con = new Conn();
//Test test = new Test();
//Type type = con.GetType();
foreach (XmlNode var in list.ChildNodes)
{
ReadXmlAndInitClass(var,con);
}
Console.WriteLine("DataBase:"+con.DataBase);

Console.ReadLine();
}



void ReadXmlAndInitClass(XmlNode node, Object obj)
{
if (node.ChildNodes.Count == 1)
{
string name = node.Name;
string value = node.InnerText;
PropertyInfo p= obj.GetType().GetProperty(name);
if (p != null)
p.SetValue(obj, value, null);
}
else
{
string name = node.Name;

PropertyInfo p = obj.GetType().GetProperty(name);
if (p != null)
{
object oo = Activator.CreateInstance(p.PropertyType);
foreach (XmlNode var in node.ChildNodes)
{
ReadXmlAndInitClass(var, oo);
}
p.SetValue(obj, oo, null);
}
}
}
WolfGray 2010-01-08
  • 打赏
  • 举报
回复
路过帮顶
jerry_zhang99 2010-01-08
  • 打赏
  • 举报
回复
你是用的XmlDocument做的,挺不错的,不过我没有用过,所以只能给你一点建议,就是你可以用Serializer类来做,像你这种单层的xml直接serializer到这个你定义的这个类中,就可以赋值相应的属性。非常快,缺点就是对于多层的处理并不好
nkboy 2010-01-08
  • 打赏
  • 举报
回复
这个貌似用dom操作方便一点

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧