2016-12-21 1 views
2

Je tente d'interroger un document XML et de renvoyer un nombre stocké dans une balise COUNT à l'intérieur d'une balise METEDATA. Le problème est que j'ai de la difficulté à accéder à la propriété strCount pour l'utiliser dans le programme. Ive considéré en boucle à travers le IEnumerable, mais espérait être en mesure d'accéder à la valeur de manière plus propre. Telles que return countQ.strCount notre countQ ["strCount"]. Je sais que ceux-ci ne fonctionnent pas dans ce cas mais voulaient illustrer le désir d'utiliser le nom de la propriété que je veux la valeur par opposition à l'indexation ou à une boucle.Accès à des propriétés spécifiques dans IEnumerable

CODE

Private XDocument doc = XDocument.Load(path);  

public class entityCount 
{ 
    public string strCount { get; set; } 
} 


public IEnumerable<entityCount> queryCount(){ 
     var countQ = this.doc.Descendants("METADATA") .Select(m => new entityCount { 
      strCount = m.Element("COUNT").Value 
     }); 

     return countQ.....?;  
} 

XML ABRÉGÉ

<PRODUCTION_SET> 
    <METADATA> 
     <COUNT>322</COUNT> 
    </METADATA> 
    <ENTITY> 
     <METADATA> 
      <ID>1</ID> 
      <foo>x</foo> 
      <bar>y</bar> 
     </METADATA> 
    </ENTITY> 
    . 
    . 
    . 
    . 
    . 
    <ENTITY> 
     <METADATA> 
      <ID>322</ID> 
      <foo>x</foo> 
      <bar>y</bar> 
     </METADATA> 
    </ENTITY> 
</PRODUCTION_SET> 

Répondre

3

Pour obtenir le nombre dans la première balise de métadonnées, vous pouvez simplement faire ceci: countQ.First()

Si ce que vous êtes intéressé est seulement le tag de métadonnées directement dans PRODUCTION_SET, vous ne devriez probablement pas utiliser Descendants (qui irait chercher plus profond, même dans des entités individuelles, en ignorant le contexte), mais trouver plutôt la balise PRODUCTION_SET, puis faites .Elements().Select(...).Single(). Single() est presque identique à First(), mais il s'assurera qu'il n'y a qu'un seul élément que vous recherchez. Dans ce cas, le code ressemblerait à ceci:

public entityCount queryCount(){ 
    return this.doc.Root.Elements("METADATA").Select(m => new entityCount { 
     strCount = m.Element("COUNT").Value 
    }).Single(); 
} 
+0

Cela renvoie une erreur de type. « Ne peut pas implicitement;?. Y Type de concert namespace.enitiyCount à System.Collection.Generic.IEnumerabl manquants un casting – LCaraway

+0

Oui, désolé, je l'ai changé pour revenir entityCount au lieu de IEnumerable Est-ce ce que vous » Alors, vous pouvez l'utiliser de cette façon: 'queryCount(). strCount' – Neme

+0

Oh juste vu ça! J'aime comment c'est propre! – LCaraway

0

vous pouvez obtenir le premier élément du IEnumerable<T> en utilisant First() ou FirstOrDefault() comme:

var queryCountResult = countQ.FirstOrDefault(); 
if(queryCountResult !=null) 
{ 
    var count = queryCountResult.strCount; 
} 
2

Vous pouvez convertir le IEnumerable <T> à une liste et accéder aux éléments via leurs indices:

int cnt = countQ.ToList()[0].strCount; 
return cnt; 

La question est, votre requête ne retourne jamais un élément? Si vous savez que vous avez un seul article, vous pouvez simplement utiliser First():

int cnt = countQ.First().strCount; 
return cnt; 
+0

nous ne pouvons pas l'indice d'objet IEnumerable –

+0

dans cet exemple particulier, il ne jamais être un élément. Je vais avoir une requête séparée qui va retourner le multiple de retour. – LCaraway

+0

@EhsanSajjad - ah, votre droite. Actualisé. –