2010-05-26 3 views
0

J'ai un IEnumerable <someClass>. J'ai besoin de le transformer en XML. Il existe une propriété appelée "ZoneId". J'ai besoin d'écrire du XML basé sur cette propriété, alors j'ai besoin de quelques éléments décents qui fournissent des données pertinentes pour le ZoneId. Je sais que j'ai besoin d'un type de groupement. Voici ce que j'ai tenté jusqu'ici sans beaucoup de succès. ** L'inventaire est un IEnumerable <someClass>. Je recherche donc l'inventaire pour des zones uniques. Cela fonctionne bien.LinqToXML pourquoi mon objet est-il hors de portée? Aussi devrais-je faire un groupe par?

var zones = inventory.Select(c => new { 
      ZoneID = c.ZoneId 
      , ZoneName = c.ZoneName 
      , Direction = c.Direction 
     }).Distinct(); 

Non Je souhaite créer un fichier XML en fonction des zones et des emplacements. *** lieu est une propriété de 'someClass'. Ceci ne compile pas car "station" est hors de portée quand j'essaye d'ajouter l'élément "nom-station". Cependant, je supprime le paren après 'ZoneId', la station est dans la portée et je récupère le nom de la station. Le seul problème est que l'élément est alors un descendant de 'station-id'. Ce n'est pas la sortie désirée. Ils devraient être frères et soeurs. Qu'est-ce que je fais mal? Enfin, après l'élément "nom-station", j'aurai besoin d'un autre type complexe qui est une collection. Appelez-le "lieux" .Il aura des éléments enfants appelés "lieu", ses données proviendront de IEnumerable et je ne veux que des "places" qui ont le "ZoneId" pour la zone actuelle.Quelqu'un peut me pointer dans la bonne direction est-il une erreur de sélectionner des zones distinctes de la IEnumerable? Cet objet a toutes les données que je dois à l'intérieur. Je juste besoin de faire heirarchical. Merci pour tous les pointeurs tous.

Cheers,
originale Chris à San Diego

**** Modifier

var zones = inventory.Select(c => new { 
      ZoneID = c.ZoneId 
      , ZoneName = c.ZoneName 
      , Direction = c.Direction 
     }).Distinct(); 

     var xml = new XElement("MSG_StationInventoryList" 
           , zones.Select(station => new XElement("StationInventory" 
            , new XElement("station-id", station.ZoneID) 
            , new XElement("station-name", station.ZoneName) 
            , new XElement("station-travel-direction", station.Direction) 
            , new XElement("detector-list" 
             , inventory.Where(p=>p.ZoneId == station.ZoneID).Select(plaza=> 
             new XElement("detector" 
              , new XElement("detector-id", plaza.PlazaId))))))); 

Cela a fini par travailler.

+0

Je ne suis pas sûr de comprendre le peu de lieux ... pouvez-vous clarifier ce que vous voulez dire? Peut-être donner un exemple? – dtb

Répondre

3

Essayez ceci:

zones.SelectMany(station => new object[] 
{ 
    new XElement("station-id", station.ZoneID), 
    new XElement("station-name", station.ZoneName), 
    station.Places.Select(place => new XElement("place", place)) 
}) 

Cela crée une structure XML comme ceci:

<MSG_StationInventoryList> 
    <StationInventory> 
     <station-id>Test1</station-id> 
     <station-name>Test Station 1</station-name> 
     <place>place1a</place> 
     <place>place1b</place> 
     <place>place1c</place> 
     <station-id>Test2</station-id> 
     <station-name>Test Station 2</station-name> 
     <place>place2a</place> 
     <place>place2b</place> 
     <station-id>Test3</station-id> 
     <station-name>Test Station 3</station-name> 
     <place>place3a</place> 
    </StationInventory> 
</MSG_StationInventoryList> 

Est-ce votre intention?


Si vous pouvez modifier la structure XML à quelque chose de différent, je vous suggère de faire comme ceci:

<MSG_StationInventoryList> 
    <StationInventory> 
     <station> 
      <station-id>Test1</station-id> 
      <station-name>Test Station 1</station-name> 
      <places> 
       <place>place1a</place> 
       <place>place1b</place> 
       <place>place1c</place> 
      </places> 
     </station> 
     <station> 
      <station-id>Test2</station-id> 
      <station-name>Test Station 2</station-name> 
      <places> 
       <place>place2a</place> 
       <place>place2b</place> 
      </places> 
     </station> 
     <station> 
      <station-id>Test3</station-id> 
      <station-name>Test Station 3</station-name> 
      <places> 
       <place>place3a</place> 
      </places> 
     </station> 
    </StationInventory> 
</MSG_StationInventoryList> 

Ensuite, vous pouvez simplement créer un XElement pour chaque station et lieu:

zones.Select(station => new XElement("station", 
    new XElement("station-id", station.ZoneID), 
    new XElement("station-name", station.ZoneName), 
    new XElement("places", 
     station.Places.Select(place => new XElement("place", place))))