2009-11-12 136 views
1

我無法完全正確地查詢我的查詢。鑑於此XML:LinqtoXML:獲取元素值

<?xml version="1.0" encoding="utf-8" ?> 
<FileTypes> 
    <File type="photo"> 
    <Extension>.jpg</Extension> 
    <Extension>.gif</Extension> 
    </File> 
    <File type="document"> 
    <Extension>.pdf</Extension> 
    </File> 
    <File type="video"> 
    <Extension>.flv</Extension> 
    </File> 
</FileTypes> 

我想提取給定文件類型的字符串數組的擴展名。這是我到目前爲止:

var query = from m in _UploadFileTypes.Elements("FileTypes").Elements("File") 
    where m.Attribute("type").Value.ToUpper() == fileTypeFilter 
    select m.Elements("Extension"); 

foreach (var item in query) 
{ 
    //item.ToString() does not yield the correct value... 
} 

任何幫助將不勝感激!

回答

2

試試這個:

var query = 
    from file in _UploadFileTypes.Root.Elements("File") 
    let typeAttrib = file.Attribute("type") 
    where 
     typeAttribute != null 
     && typeAttribute.Value.ToUpper() == fileTypeFilter 
    from extension in file.Elements("Extension") 
    select extension.Value; 
foreach (var extension in query) 
{ 
    // extension is the string content of the Extension element 
} 
+0

只是FYI,如果一個File元素沒有type屬性,這將產生一個NullReferenceException。 (這可能並不重要,具體取決於模式。)如果這很重要,您可以更改: let typeAttribute = file.Attribute(「type」) 其中typeAttribute!= null && typeAttribute.Value.ToUpper()== fileTypeFilter – TrueWill 2009-11-12 01:42:12

+0

好的建議。我會更新代碼。 – Jacob 2009-11-12 03:25:01

+0

這只是給我的第一個元素...例如,它只返回照片類型中的.jpg ......它不包括兩個擴展名。 – 2009-11-12 14:17:09

1

@Jacob給予了極大的答案,但我相信只要使用的item.Value代替item.ToString會給你正在尋找使用您有代碼的值。

您可以使用IntelliSense將鼠標懸停在您的query上以查看它的項目是XElement類型。 @ Jacob的答案在查詢中包含.Value,所以在他的版本query中包含字符串。

+0

感謝您的輸入。當我恢復到我原來的代碼項目是一個XElements的集合。這幾乎就像我需要嵌套的foreach循環。但是,我知道只有一個具有指定屬性的元素集合。這幾乎就像我需要原始查詢來返回單個XElements集合,以便通過它們遞歸而不是返回集合的集合。 – 2009-11-12 20:33:52