2011-01-10 50 views
5

Estoy intentando recorrer un archivo Xml y mostrar el valor de la cuenta en un mensaje.Lectura de nodos Xml para cada ciclo

XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var"); 
foreach (XmlNode no in nodeList) 
{ 
    XmlNode node = testDoc.SelectSingleNode("/details/row/var[@name='account']"); 
    test.actual = node.Attributes["value"].Value; 

    MessageBox.Show(test.account); 
} 

El cuadro de mensaje muestra actualmente el primer registro repetidamente, ¿cómo puedo obtener el siguiente registro?

Gracias por su contribución con anticipación.

+2

No está utilizando la ninguna variable que es el valor de cada iteración sería uno de partida punto –

Respuesta

12

Usted está asignando en ocasiones node con el mismo elemento desde testDoc. No está claro qué es test.account (¿quizás un tipo incorrecto para test.actual)?

no es la variable que repetirá los contenidos de nodeList - Imagino que tenía la intención de usar eso.

EDITAR siguiente edición de la OP Ahora que nos has demostrado lo que es la lista de nodos, sospecho que quiere hacer algo como esto en su lugar:

XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var[@name='account']"); 
foreach (XmlNode no in nodeList) 
{  
    test.actual = no.Attributes["value"].Value; 
    ... 
+0

lugar en gracias @Chris! – Ebikeneser

0

No estoy 100% seguro, pero puede necesitar usar recursión. De lo contrario, debería ser así:

XmlDocument doc = //etc.. 
foreach(XmlNode node in doc.ChildNodes) 
{ 
    if(node.Name == "account") 
    { 
     MessageBox.Show(node.Value); 
    } 
} 
+0

-1: mientras que la corrección de código es correcta (actually usando el nodo) No veo recursividad aquí ... –

+0

Bueno, dije "si no" – ferr

+0

Necesitaba leer toda la publicación con cuidado ... editar para poder deshacer -1. Además, todavía no veo ninguna razón por la cual OP usaría la recursión: XPath ya selecciona los nodos tan profundamente como uno quiere ... –

0

No debe perder tiempo leyendo el nodo xml por nodo. Trate Deserialization:

+0

-1: Eso depende completamente de cómo se ve el infoset XML y de lo que intenta hacer con él. Deserializar a un tipo puede ser un trabajo innecesario tanto en tiempo de diseño como en tiempo de ejecución, o incluso podría no ser posible. –

+0

@Chris ~ la mejor práctica es siempre mejor que cualquier otra práctica. Solo quería que el OP supiera que * Deserialización * existe. Si estuviera haciendo esta pregunta, mencionaría que no estoy interesado en la deserialización ya que el xml es demasiado complejo y solo necesito una pequeña parte que él no hizo. – Pabuc

1

intente lo siguiente:

 //Create an xml reader; 
     XmlDocument _xmlDocument = new XmlDocument(); 
     _xmlDocument.Load(/*File Name here*/); 

     //Select the element with in the xml you wish to extract; 
     XmlNodeList _nodeList = _xmlDocument.SelectNodes("/details/row/var[@name='account']"); 

     //Display the values in the node list to the screen; 
     foreach (XmlNode _node in _nodeList) 
     { 
      String _nodeValue = _node.InnerText.ToString(); 
      MessageBox.Show(_nodeValue.ToString()); 
     } 
3

Aquí está la muestra de valor de nodo padre para obtener información del niño nodes.here estoy usando el ParentNode ReportItems e imprimir sólo los nodos secundarios imagen.

 xmldoc.Load(rdlFile); 
     StringBuilder sb=new StringBuilder(); 
     XmlNode node = xmldoc.GetElementsByTagName("ReportItems")[0]; 
     XmlNodeList list = node.ChildNodes; 
     atributes=new string[node.ChildNodes.Count]; 
     int l = 0; 
     for (int j = 0; j < node.ChildNodes.Count; j++) 
     { 


      if (list[j].Name == "Image") 
      { 
       XmlAttributeCollection att = list[j].Attributes; 
       atributes[l] = att[0].Value.ToUpper(); 

      } 
      l++; 
     } 
     for (int i = 0; i < node.ChildNodes.Count; i++) 
     { 
      if (searchText.Text.ToUpper() == atributes[i]) 
      { 
       XmlNodeList lastlist = node.ChildNodes; 
       XmlNodeList endlist = lastlist[i].ChildNodes; 
       for (int k = 0; k < endlist.Count; k++) 
       { 
        sb.Append(endlist[k].Name+" - "+ endlist[k].InnerText); 
        sb.Append("\n"+"\n"); 
       } 

      } 

     } 

hágamelo saber si usted tiene dudas ..

5
 XmlDocument doc = new XmlDocument(); 
     doc.Load("d:\\test.xml"); 
     XmlNodeList node = doc.GetElementsByTagName("w:r"); 
     foreach (XmlNode xn in node) 
     { 
      try 
      { 
       if (xn["w:t"].InnerText != null) 
       { 
        if (xn["w:t"].InnerText == "#") 
        { 
         string placeHolder = xn["w:t"].InnerText; 
         foreach (XmlNode a in node) 
         { 
          if (a["w:t"].InnerText != "#") 
          { 
           string placeHolder1 = a["w:t"].InnerText; 
          } 
         } 
        } 
       } 
      } 

      catch (Exception e) 
      { 
       Console.Write(e); 
      } 
     } 
2

probar esto,

XmlDocument xdoc = new XDocument(); 

xdoc.Load("*/File/*"); 
string xmlcontents = xdoc.InnerXml; 

var xpath = "(/details/row/var[@name='account'])"; 

XmlNodeList lists = xdoc.DocumentElement.SelectNodes(xpath); 

foreach (XmlNode _node in lists) 
{ 
    string _nodeValue = _node.InnerText; 
    MessageBox.Show(_nodeValue); 
} 
Cuestiones relacionadas