2011-01-10 21 views
5

Sto provando a eseguire il ciclo di un file Xml e visualizzare il valore dell'account in un messaggio.Lettura del nodo Xml per ciascun ciclo

La finestra di messaggio sta attualmente visualizzando ripetutamente il primo record, come posso passare al record successivo?

Grazie per l'input in anticipo.

+2

Non si sta utilizzando la nessuna variabile che è il valore da ogni iterazione sarebbe uno di partenza point –

risposta

12

Si assegna ripetutamente lo node allo stesso elemento da testDoc. Non è chiaro cosa sia test.account (forse un errore di battitura per test.actual)?

no è la variabile che itererà il contenuto di nodeList - Immagino che tu abbia intenzione di usarlo.

EDIT seguente modifica di OP Ora che ci hai mostrato cosa nodeList è, ho il sospetto che si vuole fare qualcosa di simile a questo, invece:

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

spot on grazie @Chris! – Ebikeneser

0

Io non sono sicuro al 100%, ma si potrebbe essere necessario ricorrere alla ricorsione. In caso contrario, dovrebbe essere proprio questo:

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

-1: mentre la correzione del codice è corretta (utilizzando esclusivamente il nodo) Non vedo alcuna ricorsione qui ... –

+0

Bene, ho detto "se non" – ferr

+0

Avevo bisogno di leggere tutto il post attentamente ... modifica in modo da poter annullare -1. Non vedo ancora alcun motivo per cui OP ricorrerebbe alla ricorsione: XPath seleziona già i nodi più profondi di quanto si voglia ... –

0

Non si dovrebbe passare il tempo con la lettura del nodo xml per nodo. Prova Deserialization:

+0

-1: Dipende interamente da cosa è l'infoset XML e da cosa sta provando a fare con esso. La deserializzazione di un tipo può essere un carico di lavoro non necessario sia in fase di progettazione che in fase di esecuzione, oppure potrebbe non essere nemmeno possibile. –

+0

@Chris ~ le migliori pratiche sono sempre migliori di qualsiasi altra pratica. Volevo solo che l'OP sapesse che * la deserializzazione * esiste. Se stavo facendo questa domanda, vorrei dire che non mi interessa la deserializzazione poiché l'xml è troppo complesso e ho solo bisogno di una piccola parte che non ha. – Pabuc

1

provare quanto segue:

 //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

Ecco il campione per il valore nodo padre per ottenere informazioni del bambino nodes.here sto usando il ReportItems ParentNode e stampare solo nodi figlio di immagine.

 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"); 
       } 

      } 

     } 

fatemi sapere se avete dubbi ..

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

Prova questa,

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); 
} 
Problemi correlati