2010-01-13 3 views
1

Cette méthode:Méthode attributs non XML lecture

public static string[] getKeywords(string filename) 
{ 
    string[] keywords = XElement.Load(filename).Elements("Keyword").Attributes("name").Select(n => n.Value).ToArray 
    return keywords; 
} 

ne lit pas le fichier xml. J'ai même testé tous les endroits où ça s'appelait et cela m'a ramené à getKeywords. J'ai même testé par

string[] test = getKeywords("APIs\\cmake.xml"); 
textbox.Text = test[0]; 

Et je reçois une exception ArrayIndexOutOfBounds. Le fichier xml est accessible par cette méthode. Juste qu'il ne lit pas l'attribut. Voici un exemple du fichier xml:

<Keywords> 
... 
<Keyword name ="if" /> 
<Keyword name ="else" /> 
... 
</Keywords> 

Qu'est-ce qui ne va pas?

Répondre

2

EDIT: L'appel Elements("Keyword") retourne le contenant un dénombrable l'ensemble des éléments qui sont Keyword directement dans la racine du document. Comme il n'y en a pas (la racine du document contient un seul élément Keywords (plural), vous n'obtenez aucune valeur.

Vous devez obtenir tous les Keyword éléments dans le document, comme celui-ci:

return XElement.Load(filename) 
       .Descendants("Keyword") 
       .Attributes("name") 
       .Select(n => n.Value) 
       .ToArray() 

Vous pouvez explicitement obtenir tous les Keyword éléments dans l'élément Keywords, comme ceci: (Ce ne sera pas obtenir Keyword éléments qui sont à l'intérieur d'autres éléments)

return XElement.Load(filename) 
       .Element("Keywords") 
       .Elements("Keyword") 
       .Attributes("name") 
       .Select(n => n.Value) 
       .ToArray() 
0

Essayez cette

string[] keywords = 
    XElement.Load(filename ) 
     .Elements("Keyword") // not "Keywords" 
     .Attributes("name" ) 
     .Select(n => n.Value) 
     .ToArray(); 
+0

désolé, qui était ma faute de frappe –

+0

ce code renvoyé '{ "si", "else"}' me; c'est faux? –

0

logique Vous est légèrement. Vous devez utiliser: XElement.Load(filename).Element("Keywords").Elements("Keyword").Select(n => n.Attributes("name")FirstOrDefault.value).ToArray

Pour chaque nœud mot-clé, il renvoie la valeur de l'attribut name .