2012-09-09 3 views
3

Je travaille sur ce problème pendant quelques heures maintenant et j'ai cherché tout autour avec pas de chance pour une solution :(nœud suivant en XML avec le même nom d'élément

Ce que je suis en train de faire est d'imprimer les noms des nœuds, ce que j'ai est la quantité de nœuds qui existent donc je sais combien de fois à boucle, mais ai le plus dur des temps de récupération des valeurs

ce que j'ai essayé:

int num = Convert.ToInt32(queuecount); 
var jobs = QueueXML.SelectSingleNode(xpathjobsfilename).InnerText; 
PreviousQueue = jobs.ToString(); 

//foreach(loop < num) 
//{ 
// if (CurrentQueue == PreviousQueue) 
// { 

// } 
// else 
// { 
//  resultsListView.Items.Clear(); 
//  resultsListView.Items.Add(jobs[num]); 
// } 
// loop++; 
//} 

foreach (char JobName in jobs.ToString()) 
{ 
    if (CurrentQueue == PreviousQueue) 
    { 
    } 
    else 
    { 
     resultsListView.Items.Clear(); 
     resultsListView.Items.Add(jobs[num]); 
    } 
} 

Editer: Exemple XML

<jobs> 
    <job> 
     <timeleft>0:00:00</timeleft> 
     <mb>1419.60536003</mb> 
     <msgid></msgid> 
     <filename>Extended_Final</filename> 
     <mbleft>1274.33209419</mbleft> 
     <id>nzo_i7qxxq</id> 
    </job> 
    <job> 
     <timeleft>0:00:00</timeleft> 
     <mb>9.22459220886</mb> 
     <msgid></msgid> 
     <filename>Video2</filename> 
     <mbleft>9.22459220886</mbleft> 
     <id>2m3dv5</id> 
    </job> 
    </jobs> 

Je veux récupérer les détails d'emploi pour chaque emploi individuel

+0

Pourriez-vous montrer et d'exemple la structure XML et le résultat que vous recherchez? – Jan

+0

Je viens d'éditer la question originale avec un exemple – KPS

+0

Qu'est-ce que vous voulez exactement extraire? – Jan

Répondre

1

Utilisez LINQ2XML

XElement doc=XElement.Load("yourXMLfile.xml"); 

string timeleft,mb,msgid,filename,mbleft,id; 

foreach(XElement elm in doc.Descendants().Elements("job")) 
{ 
    timeleft = elm.Element("timeleft").Value; //time left value 
    mb = elm.Element("mb").Value; //mb value 
    msgid = elm.Element("msgid").Value; //msgid value 
    filename = elm.Element("filename").Value; //filename value 
    mbleft = elm.Element("mbleft").Value; //mbleft value 
    id = elm.Element("id").Value; //id value 
} 
+0

Je reçois cette erreur: Erreur uniquement assignation, appel, incrément, décrément, attendre, et de nouvelles expressions d'objets peuvent être utilisés comme une déclaration – KPS

+0

@KPS Vérifiez ma réponse – Anirudha

+0

@KPS modifié l'erreur due au fait que vous êtes ne pas assigner la valeur à quelque chose .. assigner toutes les valeurs à la chaîne ... – Anirudha

2

Utilisez ce code pour boucle à travers votre travail nœuds.

XmlDocument doc = new Windows.Data.Xml.Dom.XmlDocument(); 
doc.Load(@"/path/to/xml/file"); 

foreach (XmlNode job in doc.SelectNodes("/jobs/job")) 
{ 
    string filename = job.SelectSingleNode("filename").InnerText; 
    double mbleft = double.Parse(job.SelectSingleNode("mbleft").InnerText); 
} 

Je ne suis pas tout à fait sûr de ce que vous voulez faire avec elle. Si vous souhaitez utiliser cette information tout au long de votre programme, je créer un type de données de travail et analyser le document XML à List<Job>. Dans tous les cas, le code ci-dessus vous permettra d'accéder aux informations que vous recherchez.

+0

Hmm c'est une application de métro que j'essaie de faire et qui semble être un espace de noms XmlNode n'est pas disponible – KPS

+0

J'ai mis à jour la première ligne de mon code. Est-ce que ça marche? – Jan

+0

Erreur Le type ou le nom de l'espace de nom 'XmlNode' est introuvable (vous manque une directive using ou une référence d'assembly?) – KPS

0

Voici le code pour ajouter des détails d'emploi individuels à une liste de dictionnaire. Il élimine la sélection d'un nœud unique dans la boucle lorsqu'il y a beaucoup de nœuds enfants. Et, plus générique.

System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
doc.LoadXml(yourXmlString);    
if (doc.HasChildNodes) 
{ 
    System.Xml.XmlNodeList jobLst = doc.DocumentElement.ChildNodes; 
    System.Collections.Generic.Dictionary<string, string> jobDescription; 
    var lstjobDescription = new System.Collections.Generic.List<System.Collections.Generic.Dictionary<string, string>>(); 
    string name; 
    for (int i = 0; i < jobLst.Count; i++) 
    { 
     var responseDoc = new System.Xml.XmlDocument(); 
     responseDoc.LoadXml(jobLst[i].OuterXml); 
     jobDescription = new System.Collections.Generic.Dictionary<string, string>(); 
     foreach (System.Xml.XmlNode node in responseDoc.SelectNodes("//job/*")) //select all nodes of Job 
     {     
      jobDescription.Add(node.Name, node.InnerText); 
     } 
     lstjobDescription.Add(jobDescription);      
    } 
}   
Questions connexes