使用linq将C#类转换为xml

时间:2017-09-27 11:26:42

标签: c# xml linq

大家好我有3节课如下

public class Main
{
    public List<B> BList{ get; set; }
}
public class B
{
    public B()
    {
        ListA = new List<A>();
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public List<A> ListA { get; set; }
}
public class A
{
    public int Rating { get; set; }
    public int Weightage { get; set; }
}

我正在尝试在添加数据后使用linq将其转换为XML

Main main = new Main ();
var xEle = new XElement("Root", 
    from x in main.BList
    from te in x.A 
    select new XElement("Child", 
        new XElement("Weightage", te.Weightage), 
        new XElement("FName", x.FirstName),
        new XElement("LName", x.Email) ));

这给我输出如下

    <Root>
  <Child>
    <Weightage>20</Weightage>
    <FName>ABC</FName>
    <LName>abc@abc.com</LName>
  </Child>
  <Child>
    <Weightage>20</Weightage>
    <FName>ABC</FName>
    <LName>abc@abc.com</LName>
  </Child>
</Root>

我需要的是如下

    <Root>
  <Child>
    <Weightage>10</Weightage>
    <FName>ABC</FName>
    <LName>abc@abc.com</LName>
  </Child>
  <Child>
    <Weightage>20</Weightage>
    <FName>ABC</FName>
    <LName>abc@abc.com</LName>
  </Child>
</Root>

Fiddler https://dotnetfiddle.net/x6Hj01

2 个答案:

答案 0 :(得分:5)

  

问题:

您的问题不在于linq,而在于您如何填充数据:

Master m=new Master();
m.BList =new List<B>();

B b=new B();
b.FirstName ="ABC";
b.Email="abc@abc.com";

A a=new A();    //Line 1
a.Rating = 1;
a.Weightage =10;

b.ListA.Add(a); //Line 2

a.Rating = 2;   <--- problem here
a.Weightage =20;

b.ListA.Add(a); //Line 3
m.BList.Add(b);

只实例化a一个(在“第1行”),然后用数据填充它并将其添加到列表中(在“第2行”)。然后重新分配数据并将其再次添加到列表中(在“第3行”)。

当您再次将值分配到a时,您实际上仍在更新与之前相同的引用。因此,您在列表中获得两次相同的对象并使用相同的值,因为它是同一个对象。

  

解决方案:

要解决此问题,请在问题行之前添加A a = new A()

  

建议和改进:

  1. 更清晰的方法就是使用对象初始值设定项:

    Master m=new Master
    {
        BList = new List<B>
        {
            FirstName = "ABC",
            Email = "abc@abc.com",
            AList = new List<A>
            {
                 new A { Rating = 1, Weightage = 10 },
                 new A { Rating = 1, Weightage = 20 },
            }
        }
    };
    
  2. 关于构建xml的方法我建议使用 序列化。 Look here for some examples

  3. 另一项改进是以这种方式初始化集合: (可能来自C#6.0)

    public class Main
    {
        public List<B> BList { get; set; } = new List<B>()
    }
    public class B
    {
        public List<A> ListA { get; set; } = new List<A>()
    }
    

答案 1 :(得分:0)

序列化数据的另一种方法是使用DataContract Serializer。

您可以找到更多信息on msdn Here.

这比你的解决方案更容易:)