2010-01-13 3 views
1

Этот метод:метод не читает XML атрибуты

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

не будет читать файл XML. Я даже тестировал каждое место, которое он называл, и он вернулся к getKeywords. Я даже проверил его на

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

И я получаю исключение ArrayIndexOutOfBounds. Этот XML-файл доступен по этому методу. Просто, чтобы он не читал атрибут. Ниже приведен пример XML-файла:

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

Что не так?

ответ

2

РЕДАКТИРОВАТЬ: Elements("Keyword") вызова возвращает Перечислимый, содержащие все Keyword элементов, которые находятся непосредственно в корневом каталоге документов. Поскольку их нет (корень документа содержит один элемент Keywords (множественное число)), вы не получаете никаких значений.

Вы должны получить все Keyword элементов в документе, например:

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

В качестве альтернативы, вы можете явно получить все Keyword элементов внутри Keywords элемента, как это: (Это не будет получить Keyword элементы, которые находятся внутри других элементов)

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

Попробуйте

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

жаль, что моя опечатка –

+0

этот код возвращается '{«если»,«еще»}' ко мне; это не правильно? –

0

Вы логика, немного смещенных. Вы должны использовать: XElement.Load(filename).Element("Keywords").Elements("Keyword").Select(n => n.Attributes("name")FirstOrDefault.value).ToArray

Для каждого ключевого узла, он будет возвращать значение имени атрибута.