10
votes

Noeud XML Lecture pour chaque boucle

J'essaie de boucler via un fichier XML et d'afficher la valeur pour compte dans un message.

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


1 commentaires

Vous n'utilisez pas la variable sans que la valeur de chaque itération serait un point de départ.


7 Réponses :


15
votes

Vous attribuez de manière répétée noeud code> avec le même élément de Testdoc code>. Il n'est pas clair ce que test.accompount code> est (peut-être un erreur pour test.actual code>)?

non code> est la variable qui va itération Le contenu de NODELIST code> - J'imagine que vous aviez l'intention d'utiliser cela. P>

EDIT STRY> SUIVANT EDIT DE OP Maintenant, vous nous avez montré ce que NODELIST est, je soupçonne que vous voulez faire quelque chose comme ça à la place: P>

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


0 commentaires

0
votes

Je ne suis pas sûr à 100%, mais vous devrez peut-être utiliser une récursive. Sinon, cela devrait simplement ressembler à ceci: xxx


1 commentaires

J'avais besoin de lire attentivement tout ce que je peux éditer afin que je puisse annuler -1. De plus, je ne vois toujours aucune raison pour que OP utiliserait la récursion - XPath sélectionne déjà des nœuds aussi profonds que l'on veut ...



0
votes

Vous ne devriez pas passer du temps à lire le nœud XML par le nœud. Essayez désériorialisation :


2 commentaires

-1: Cela dépend entièrement de ce que l'on ressemble à l'infos de XML et ce qu'il essaie de faire avec elle. La désérialisation à un type peut être des charges de travail inutiles à la fois au moment de la conception et à l'exécution, ou peut-être même pas possible.


@Chris ~ Meilleure pratique est toujours meilleur que toute autre pratique. Je voulais juste que l'OP sache que désérialisation existe. Si je posais cette question, je voudrais mentionner que je ne suis pas intéressé par la désérialisation depuis que le XML est trop complexe et j'ai juste besoin d'une petite partie qu'il n'a pas.



1
votes

Essayez ce qui suit:

        //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());
        }


0 commentaires

3
votes

Voici l'échantillon de la valeur des nœuds parent pour obtenir des informations sur les nœuds enfants.here J'utilise le reporterItems Parentnode et imprimer uniquement des nœuds d'enfant.

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

            }

        }


0 commentaires

5
votes
        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);
            }
        } 

0 commentaires

3
votes

Essayez ceci,

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


0 commentaires