2010-12-09 16 views
0

J'essaie de générer un fichier XML en utilisant les données d'une classe, qui a un nom et plusieurs adresses associées au nom. Je me perds @ ajouter plusieurs adresses à la XElement. Quelqu'un peut-il m'aider s'il vous plaît. Merci d'avance BB.Construire XML en utilisant linq pour les objets

Mes classes:


    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() 
                 ) 
              ) 
            ); 
     } 

Répondre

2

Je pense que le problème est dans la section input.Select(c => {c.driverAddress.Select (d =>.

Vous êtes déjà itérer bien entrée comme moi, alors peut faire le long des lignes de

from d in i.driverAddress 
select new XElement("address", 
      new XElement("street1", d.Street1), 
      new XElement("street2", d.Street2), 

etc ...

MISE À JOUR: Les adresses du pilote ne doit pas être sortie comme les enfants du sujet, essayez ce qui suit:

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) 
       ) 
     ) 

    ) 
); 
+0

merci. Mon exigence est que tous les sujets doivent être sous tag et toutes les adresses sous tag. donc, "input.Select (c => {c.driverAddress.Select (d =>" n'est pas du tout dépendant de "i" – BumbleBee

+0

s'il vous plaît pourriez-vous nous indiquer comment vous voulez que le XML résultant ressemble? – devrooms

+0

< sous réserve subjectId = "1">

BumbleBee