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); }
7 Réponses :
Vous attribuez de manière répétée 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> 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>
XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var[@name='account']");
foreach (XmlNode no in nodeList)
{
test.actual = no.Attributes["value"].Value;
...
Je ne suis pas sûr à 100%, mais vous devrez peut-être utiliser une récursive. Sinon, cela devrait simplement ressembler à ceci:
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 ...
Vous ne devriez pas passer du temps à lire le nœud XML par le nœud. Essayez désériorialisation : p>
-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 i> 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.
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()); }
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"); } } }
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); } }
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); }
Vous n'utilisez pas la variable sans que la valeur de chaque itération serait un point de départ.