2009-12-11 4 views
1

je travaille avec un fichier xml qui ressemble à ceci:les attributs d'arbre XML à l'aide LINQ

<?xml version="1.0" encoding="UTF-8"?> 
<element1 xmlns="http://namespace1/"> 
    <element2> 
    <element3> 
     <element4 attr1="2009-11-09"> 
     <element5 attr2="NAME1"> 
      <element6 attr3="1"> 
      <element7 attr4="1" attr5="5.5" attr6="3.4"/> 
      </element6> 
     </element5> 
     <element5 attr2="NAME2"> 
      <element6 attr3="1"> 
      <element7 attr4="3" attr5="4" attr6="4.5"/> 
      </element6> 
     </element5> 
     </element4> 
    </element3> 
    </element2> 
</element1> 

où je dois faire une boucle par element5 et récupérer les attributs dans un Ienumberable comme celui-ci:

attr1, attr2, attr3, attr4, attr5, attr6

en utilisant linq à xml et C#. Je peux parcourir l'élément 5 et obtenir toutes les informations de l'attribut2, mais je n'arrive pas à comprendre comment obtenir les attributs parent ou enfant dont j'ai besoin.

MISE À JOUR: Merci pour le retour d'expérience jusqu'à présent. Pour plus de clarté, je dois faire une boucle à travers l'attribut5. Donc, fondamentalement, ce que j'ai en ce moment (ce qui n'est pas beaucoup) est. . .

XElement xel = XElement.Load(xml); 
IEnumberable<XElement> cList = from el in xel.Elements(env + "element2").Element 
(n2 + "element3").Elements(n2 + "element4").Elements(ns + "element5") select el; 

foreach (XElement e in cList) 
Console.WriteLine(e.Attribute("attr2").Value.ToString()); 

Cela me donnera la valeur toutes les attr 2 dans la boucle, mais je pourrais aller sur ce tout faux pour ce que je suis en train de acheive. J'ai également besoin de collecter les autres attributs mentionnés ci-dessus dans une collection (la référence de la console est juste moi jouant avec cela maintenant mais le résultat final dont j'ai besoin est une collection). Donc, les résultats finaux seraient une collection comme

attr1,  attr2, attr3, attr4, attr5, attr6 
2009-11-09, name1, 1,  1,  5.5, 3.4 
2009-11-09, name2, 1,  3,  4,  4.5 

Comment faire?

+0

Je ne suis pas complètement sûr que vous voulez renvoyer les données, il y a plusieurs éléments de Element5. Voulez-vous un ienumerable qui renvoie attr1, attr2, attr3, .., attr6, attr1 (de l'élément suivant)? Ou un nombre d'objets avec attr1 till attr6? –

+0

Je serais ravi d'avoir un peu de rétroaction sur le fait de savoir si nous avons répondu à votre question, et si ce n'est pas le cas, ce que nous n'avons pas tout à fait raison ... Vous avez deux réponses maintenant. – LorenVS

+0

essayé d'ajouter un commentaire, mais a couru après la limite de 600 caractères, donc j'ai mis à jour le poste. – nelsonwebs

Répondre

0

Pas tout à fait clair, mais cela pourrait être un point de départ:

XElement el = // something here 
el.Descendants().Concat(new XElement[]{el}).SelectMany(e => e.Attributes()) 

Je ne pense pas avoir exactement ce que vous cherchez ... Vous faites sonner comme vous commencez avec un référence à un élément5 et vous voulez monter et descendre l'arbre?

EDIT: Je pense que cela pourrait être ce que vous cherchez (après avoir lu votre question encore une fois):

XElement el = // something here 
el.Descendants().Concat(new XElement[]{el}).Where(e => e.Name.LocalName == "element5").SelectMany(e => e.Attributes()) 
+0

Désolé pour le manque de clarté, j'ai ajouté quelques notes supplémentaires ci-dessus. – nelsonwebs

1

Utilisez LINQ-to-xml pour naviguer dans l'arborescence jusqu'à (parents/ancêtres) ou bas (élément/éléments/descendants). Voir pour plus de détails.

XDocument doc 

var q = from element5 in doc.Elements("element5") 
     let element4 = element5.Parent 
     let element6 = element5.Element("element6") 
     let element7 = element6.Element("element7") 
     select new { 
        attr1 = (DateTime)element4.Attribute("attr1"), 
        attr2 = (string)element5.Attribute("attr2"), 
        attr3 = (int)element6.Attribute("attr3"), 
        attr4 = (int)element7.Attribute("attr4") 
        attr5 = (float)element7.Attribute("attr5") 
        attr6 = (float)element7.Attribute("attr6") 
        } 
1
xdoc = XDocument.Load(Server.MapPath("Temp.xml")) 
Dim x = From el As XElement In xdoc...<vehicles>.Descendants.Where(Function(f) [email protected] = id.ToString) 
Dim at = From a In x.Attributes() 
For Each t In at 
Dim n = t.Name 
Dim v = t.Value 
ProcessForm(n.ToString, v) 
Next 
+0

Désolé c'est en VB mais vous pouvez facilement convertir en C#. Si vous devez obtenir tous les attributs d'un élément sans connaître le nom ou la valeur, utilisez-le pour parcourir tous les attributs d'un élément et faire n'importe quoi. Ignorez mon processform() car c'est la fonction que j'utilise pour gérer les attributs. J'espère que cela t'aides – philljohn

Questions connexes