一、前言
由于有时候返回xml格式比较严格,需要按照一定的顺序排列节点才能够符合要求,这里主要用到了自定义一个List<string> 字符顺序,再让实体属性按照List定义好的顺序重新排列实体属性集合,在用 foreach遍历实体属性集合的时候方便操作拼接XML元素。
二、新建一个控制台程序做测试就好了
1.定义三个类
public class Person { public string Name{get;set;} public string Sex { get; set; } public int Age { get; set; } public string Address { get; set; } public string Province { get; set; } } public class Father { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public Son Son { get; set; } } public class Son { public string SonName { get; set; } public int SonAge { get; set; } }
2.定义一个将实体转成XDocument的方法
static XDocument ChangeToXDocument<T>(T entity) where T : class,new() //加约束 { entity = entity ?? new T(); XDocument doc = new XDocument(); doc.Add(new XElement("xml")); var root = doc.Root; List<string> list = new List<string> { "Name", "Age", "Sex" }; if (entity is Person) { list.AddRange(new string[] { "Province", "Address" }); //xml文档格式元素节点按照这个顺序填写 } else if (entity is Father) { list.AddRange(new string[] { "Son", "SonName", "SonAge" }); //xml文档格式元素节点按照这个顺序填写 } var proNewList = entity.GetType().GetProperties().OrderBy(p => list.IndexOf(p.Name)).ToList(); //entity实体属性按照list的顺序重新排好了 foreach (var prop in proNewList) { var propName = prop.Name; if (propName == "Son")//说明要有Son节点,因为Son在这里是一个类,所以得再次调用 ChangeToXDocument<T>(T entity)方法 { var sonElement = new XElement("Son"); var son = prop.GetValue(entity, null) ;//获取Son类中的对象了 var subNodes = ChangeToXDocument(son); sonElement.Add(subNodes.Root.Elements());//Son节点添加里面的子节点 root.Add(sonElement);//根节点添加Son节点 } else //其他类型要做处理,可以在这里做判断处理完再加到root上面 { root.Add(new XElement(propName, prop.GetValue(entity, null))); } } return doc; }
3.控制台调用输出
static void Main(string[] args) { Person p = new Person(); p.Name = "校长"; p.Sex = "男"; p.Age = ; p.Address = "长隆长隆"; p.Province = "广东省"; Console.WriteLine("---------------person-----------------"); string str = ChangeToXDocument(p).ToString(); Console.WriteLine(str); Console.WriteLine("---------------father-----------------"); Father f = new Father(); f.Name = "父亲"; f.Age = ; f.Sex = "男"; Son s = new Son(); s.SonName = "儿子"; s.SonAge = ; f.Son = s; string str1 = ChangeToXDocument(f).ToString(); Console.WriteLine(str1); Console.ReadKey(); }
演示结果: