自定义一个类,类中包含公有字段,公有数组字段,可读属性,根据该类的实例构建一个xml文档,公有字段和可读属性作为节点元素,公有数组字段作为子节点。由于数组元素也可能包含公有数组字段,因此需要采用递归解决这个问题。
public static class XmlHeleper
{
/// <summary>
/// 利用反射将object实例添加到xml文档
/// </summary>
/// <param name="obj">实例</param>
/// <param name="root">根节点</param>
/// <param name="xml">xml文档</param>
public static void Object2Xml(object obj, XmlNode root, XmlDocument xml)
{
//以obj的类型名作为父节点的名字,并将父节点添加到root节点
XmlElement parent = xml.CreateElement(obj.ToString());
root.AppendChild(parent);
//取出obj的类型里面的所有公有Field
foreach (FieldInfo dp in obj.GetType().GetFields())
{
//判断是否是共有Field
if (dp.IsPublic)
{
//如果是数组
if (dp.FieldType.IsArray)
{
//以该数组Field的名字作为新父节点的名字,并递归
XmlNode node = xml.CreateElement(dp.Name);
parent.AppendChild(node);
foreach (object item in (Array)dp.GetValue(obj))
{
Object2Xml(item, node, xml);
}
}
//如果不是数组,将Field作为xml元素添加到父节点
else
{
XmlElement child = xml.CreateElement(dp.Name);
child.InnerText = dp.GetValue(obj).ToString();
parent.AppendChild(child);
}
}
}
//取出obj的类型里面的所有可读Property
foreach (PropertyInfo dp in obj.GetType().GetProperties())
{
//如果可读
if (dp.CanRead)
{
//将Property作为xml元素添加到父节点
XmlElement child = xml.CreateElement(dp.Name);
child.InnerText = dp.GetValue(obj, null).ToString();
parent.AppendChild(child);
}
}
}
}