使用linq到对象构建XML

时间:2010-12-09 23:08:12

标签: xml linq-to-objects

我正在尝试使用类中的数据生成XML文件,该类具有名称和与名称关联的多个地址。我迷路了@在XElement中添加了多个地址。 有人能帮帮我吗。 提前致谢 BB

我的课程:


     public class Subject
    {
        public ClueName name { get; set; }
        public List driverAddress { get; set;}
    }


 public class DriverAddress
    {
        public string house { get; set; }
        public string street1 { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string zip4 { get; set; }
    } 

private string BuildRequestXML(List <Subject> input)
      {
           string subjectId = "S1" ;
           XElement req = new XElement("order",
                              new XElement("order_dataset",
                                  new XElement("subjects",
                                      from i in input
                                      select 
                                      new XElement("subject", new XAttribute("id", subjectId),
                                          new XElement("name",
                                                        new XElement("first",i.name.first),
                                                        new XElement("middle", i.name.middle ),
                                                        new XElement("last", i.name.last)
                                                       )
                                                    )
                                               ),
                                           new XElement("addresses",
                                                input.Select(c => {c.driverAddress.Select (d =>
                                                    new XElement("address",                                
                                                    new XElement("street1",d.street1),
                                                    new XElement("city",d.city),
                                                    new XElement("state",d.state),
                                                    new XElement("postalcode",d.postalcode)
                                                     )).ToList ();
                                                     }).ToList()
                                                        )
                                           )
                                     );
        }

1 个答案:

答案 0 :(得分:2)

我认为问题出在input.Select(c => {c.driverAddress.Select (d =>部分。

你已经通过输入作为i进行迭代,所以可以按照

的顺序进行
from d in i.driverAddress
select new XElement("address", 
             new XElement("street1", d.Street1),
             new XElement("street2", d.Street2),

等...

更新:由于不应将驱动程序地址作为主题的子项输出,请尝试以下操作:

var addresses = new List<DriverAddress>();
input.ForEach(delegate(Subject s) { s.driverAddress.ForEach(d => addresses.Add(d)); });


string subjectId = "S1";
XElement req = new XElement("order",
    new XElement("order_dataset",
        new XElement("subjects",
            from i in input
            select
            new XElement("subject", new XAttribute("id", subjectId),
                new XElement("name",
                    new XElement("first", i.name.first),
                    new XElement("middle", i.name.middle),
                    new XElement("last", i.name.last)
                )
            )
        ),
        new XElement("addresses",
                from d in addresses
                select new XElement("address",
                        new XElement("street1", d.street1),
                        new XElement("city", d.city),
                        new XElement("state", d.state),
                        new XElement("postalcode", d.postalcode)
                )
        )

    )
);