2010-07-19 3 views
0

quelle est la meilleure façon de lire le fichier xml en utilisant linq et le code ci-dessous, vous verrez, j'ai trois boucles différentes et je ne me sens pas élégant ou ai-je des options pour retrofit le dessous code?Lire les valeurs XML en utilisant LINQ

public static void readXMLOutput(Stream stream) 
     { 
      XDocument xml = new XDocument(); 
      xml = LoadFromStream(stream); 

      var header = from p in xml.Elements("App").Elements("Application") 
         select p; 

      foreach (var record in header) 
      { 
       string noym = record.Element("nomy").Value; 
       string Description = record.Element("Description").Value; 
       string Name = record.Element("Name").Value; 
       string Code = record.Element("Code").Value; 
      } 

      var appRoles = from q in xml.Elements("App").Elements("Application").Elements("AppRoles").Elements("Role") 
         select q; 

      foreach (var record1 in appRoles) 
      { 
       string Name = record1.Element("Name").Value; 
       string modifiedName = record1.Element("ModifiedName").Value; 
      } 

      var memeber = from r in xml.Elements("App").Elements("Application").Elements("AppRoles").Elements("Role").Elements("Members") 
          select r; 

      foreach (var record2 in memeber) 
      { 

       string ExpirationDate = record2.Element("ExpirationDate").Value; 
       string FullName = record2.Element("FullName").Value;     
      } 


     } 

mise à jour:

foreach (var record in headers) 
      { 
       .............. 
       string Name1 = record.Attribute("Name").Value; 
       string UnmodifiedName = record.Attribute("UnmodifiedName").Value; 

       string ExpirationDate = record.Attribute("ExpirationDate").Value; 
       string FullName = record.Attribute("FullName").Value; 
       ............... 
      } 
+0

Que fait votre code? – dtb

+0

Y a-t-il une raison pour laquelle vous voulez utiliser Linq au lieu de simplement le désérialiser dans une classe? –

+0

@Mark: il n'y a pas de raison d'utiliser Linq et si vous avez un meilleur moyen s'il vous plaît faites le moi savoir. –

Répondre

0

Cela peut ne pas fonctionner précisément dans votre cas en fonction de la structure xml. Joue avec. Essayez-le en utilisant LinqPad

var applications = from p in xml.Descendants("Application") 
      select new { Nomy = p.Element("nomy").Value 
         , Description = p.Element("Description").Value 
         , Name = p.Element("Name").Value 
         , Code = p.Element("Code").Value 
      }; 

var appRoles = from r in xml.Descendants("Role") 
       select new { Name = r.Element("Name").Value 
          , ModifiedName = r.Element("ModifiedName").Value 
       }; 
1

Est-ce que votre code réel? Toutes les variables de chaîne que vous affectez dans les boucles foreach ont uniquement une portée d'une itération de la boucle. Ils sont créés et détruits à chaque fois.

+0

c'est correct et je l'ai fait pour tester le but ... –

0

Cette réponse est une requête hiérarchique.

var headers = 
    from header in xml.Elements("App").Elements("Application") 
    select new XElement("Header", 
    new XAttribute("noym", header.Element("nomy").Value), 
    new XAttribute("Description", header.Element("Description").Value), 
    new XAttribute("Name", header.Element("Name").Value), 
    new XAttribute("Code", header.Element("Code").Value), 
    from role in header.Elements("AppRoles").Elements("Role") 
    select new XElement("Role", 
     new XAttribute("Name", role.Element("Name").Value), 
     new XAttribute("ModifiedName", role.Element("ModifiedName").Value), 
     from member in role.Elements("Members") 
     select new XElement("Member", 
     new XAttribute("ExpirationDate", member.Element("ExpirationDate").Value), 
     new XAttribute("FullName", member.Element("FullName").Value) 
    ) 
    ) 
); 
+0

d'où vient l'en-tête? sélectionnez Nouveau XElement (« En-tête », –

+0

tête est introduit dans la ligne ci-dessus que ... d'en-tête dans –

+0

j'ai udpate ma question, il y a deux problèmes dans votre solution 1) il ne fonctionne pas en boucle 2) il ne pas lire le ExpirationDate ou FullName ... –

Questions connexes