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

Tengo que recorrer las clases para obtener 'Clase' en una matriz de cadenas. También tengo que pasar por 'Estudiantes' para poner 'Estudiante' en una serie de cadenas.Loop a través de varios subnodos en 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 
     } 

no funciona para obtener todas las clases. Además, necesito reescribir este sin usando LINQ to XML, es decir, usando XmlNodeList y XmlNodes.

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

No estoy seguro de cómo hacerlo.

+0

¿Es esta tarea? –

+0

simplemente elimine la casa de la tarea, eso es lo que es. ;) – user752709

Respuesta

4

El XPath es sencillo. Para obtener los resultados en una matriz, puede usar LINQ o un bucle regular.

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

No estoy seguro de volver a escribir para XMLNodes pero para sus clases y los estudiantes puede simplemente:

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

gracias, eso es lo que necesitaba pasar. – 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(",");