2010-08-26 4 views
1

J'ai un fichier XML complet de ceci:Comment atteindre rapidement un sous-enfant en XML?

<machine id=""> 
    <application id=""> 
    <fichier name=""/> 
    <fichier name=""/> 
    <fichier name=""/> 
    </application> 
    <application id=""> 
    <fichier name=""/> 
    <fichier name=""/> 
    <fichier name=""/> 
    </application> 
</machine> 

Je sais que l'ID de la machine et de l'application et le nom de fichier. En ce moment, je numérise toutes les machines, puis une fois trouvé, numériser l'application et une fois trouvé, scan fichier. Plutôt long, alors comment puis-je rapidement atteindre le fichier que je veux?

Répondre

2

quelque chose comme ce qui suit devrait fonctionner, en supposant chargé votre XML dans un XmlDocument appelé xmlDoc:

// load your XML (you may already have this) 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(pathToYourXML); 

// construct your XPath 
string formattedXPath = string.Format(
    "/machine[@id='{0}']/application[@id='{1}']/fichier[@name='{2}']", 
    machineId, 
    applicationId, 
    fichierName); 

// select your node 
XmlElement elementFichier = (XmlElement) xmlDoc.SelectSingleNode(formattedXPath) 

// if you need the text from this child, use this (text itself is a child node): 
string text = elementFichier.FirstChild.Value; 

PS: l'utilise ci-dessus XPath, il y a plusieurs tutoriels sur le net (comme mentionné par un autre utilisateur quant à lui), mais si vous voulez vraiment apprendre à travailler avec elle, essayez quelques-uns des livres de Jenni Tennison sur XSLT, elle est un excellent explicateur.

+0

Pour une raison quelconque, cela ne me retourne rien. Je reçois un retour nul sur xmldoc.SelectSingleNode – Wildhorn

+0

@Wildhorn: Si vous obtenez 'null', alors votre entrée est différente (ie, la racine n'est pas'/machine', remplacez-la par le bon chemin depuis la racine ou utilisez '// 'au lieu de'/') ou il y a une faute de frappe dans votre traduction, car le code ci-dessus, avec votre entrée (valeurs d'attribut ajoutées), produit un noeud pour moi ... – Abel

+0

ouais je me suis dit que j'ai égaré un '='. Était juste une typo sily :) – Wildhorn

0

Vous pouvez le faire avec LINQ to XML comme ceci:

var result = from m in xml.Descendants("machine") 
      where m.Attribute("id").Value == "1" 
       let a = m.Elements("application").Where (x => x.Attribute("id").Value == "3") 
       let f = a.Elements("fichier").Where (x => x.Attribute("name").Value == "b") 
       select f; 
Questions connexes