2010-01-13 150 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

EDIT:本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

对不起,那是我的错字 – 2010-01-13 00:33:29

+0

这段代码返回'{“如果”,“否则”}'我;这是不对的? – 2010-01-13 00:46:51

0

你的逻辑稍微偏离。您需要使用: XElement.Load(filename).Element("Keywords").Elements("Keyword").Select(n => n.Attributes("name")FirstOrDefault.value).ToArray

对于每个关键字的节点,它将返回属性的值。