2011-06-09 23 views
8
<Sections> 
    <Classes> 
     <Class>VI</Class> 
     <Class>VII</Class> 
    </Classes> 
    <Students> 
     <Student>abc</Student> 
     <Student>def</Student> 
    </Students>  
    </Sections> 

Devo scorrere le classi per ottenere "Classe" in una serie di stringhe. Devo anche passare in rassegna gli "Studenti" per inserire "Studente" in una serie di stringhe.Ciclo attraverso più sottonodi in XML

XDocument doc.Load("File.xml"); 
    string str1; 
    foreach(XElement mainLoop in doc.Descendants("Sections")) 
     { 
      foreach(XElement classLoop in mainLoop.Descendants("Classes")) 
       str1 = classLoop.Element("Class").Value +","; 
     //Also get Student value 
     } 

non funziona per ottenere tutte le classi. Inoltre, ho bisogno di riscrivere questo senza usando LINQ to XML, cioè usando XmlNodeList e XmlNodes.

XmlDocument doc1 = new XmlDocument(); 
doc1.Load("File.xml"); 
foreach(XmlNode mainLoop in doc.SelectNodes("Sections")) ?? 

Non so come procedere.

+0

È questo il compito? –

+0

basta rimuovere la casa dai compiti, ecco di cosa si tratta. ;) – user752709

risposta

4

Il XPath è semplice. Per ottenere i risultati in una matrice è possibile utilizzare LINQ o un ciclo regolare.

var classNodes = doc.SelectNodes("/Sections/Classes/Class"); 
// LINQ approach 
string[] classes = classNodes.Cast<XmlNode>() 
          .Select(n => n.InnerText) 
          .ToArray(); 

var studentNodes = doc.SelectNodes("/Sections/Students/Student"); 
// traditional approach 
string[] students = new string[studentNodes.Count]; 
for (int i = 0; i < studentNodes.Count; i++) 
{ 
    students[i] = studentNodes[i].InnerText; 
} 
1

Non sei sicuro di riscrittura per XmlNodes ma per le classi e studenti si può semplicemente:

XDocument doc.Load("File.xml"); 
    foreach(XElement c in doc.Descendants("Class")) 
    { 
     // do something with c.Value; 
    } 

    foreach(XElement s in doc.Descendants("Student")) 
    { 
     // do something with s.Value; 
    } 
+0

grazie, è quello che dovevo fare. – user752709

1

con LINQ to XML:

XDocument doc = XDocument.Load("file.xml"); 
var classNodes = doc.Elements("Sections").Elements("Classes").Elements("Class"); 
StringBuilder result = new StringBuilder(); 
foreach(var c in classNodes) 
    result.Append(c.Value).Append(","); 

Con XPath:

XmlDocument doc = new XmlDocument(); 
doc.Load("file.xml"); 
var classNodes = doc.SelectNodes("/Sections/Classes/Class/text()"); 
StringBuilder result = new StringBuilder(); 
foreach(XmlNode c in classNodes) 
    result.Append(c.Value).Append(",");