2012-01-06 187 views
2

我有一個XML文件,其中包含兩種類型的信息 - 由SLvl值確定的位置和作業類型。我希望將這些值的SearchTxt值綁定到2個下拉列表(一個用於位置,另一個用於作業類型),以用作我的頁面上的過濾器。LINQ to XML - Where子句

問題是我不能讓我的where子句過濾SLvl值。在where子句中沒有返回結果。如果我刪除它,查詢確實會返回所有文本值。

C#

using System.Xml.Linq; 
using System.Linq; 
..... 

// Loading from file 
XDocument loaded = XDocument.Load(@"http://[LINKREMOVED]/vacancies.aspx"); 

// Query the data 
var q = (from c in loaded.Descendants("items") 
     where c.Element("SLvl").ToString() == "0" 
     select c.Element("SearchTxt").ToString()).Distinct(); 

// Populate drop down 
foreach(string name in q) 
{ 
    ddlLocation.Items.Add(new ListItem(name, name)); 
} 

XML:

<VacancyMatch> 
    <items> 
    <SearchID>60</SearchID> 
    <SearchTxt>Scotland</SearchTxt> 
    <ParentID>0</ParentID> 
    <SearchCatID>1</SearchCatID> 
    <SLvl>1</SLvl> 
    <SubCat>1</SubCat> 
    </items> 
    <items> 
    <SearchID>92</SearchID> 
    <SearchTxt>Accounting</SearchTxt> 
    <ParentID>60</ParentID> 
    <SearchCatID>2</SearchCatID> 
    <SLvl>2</SLvl> 
    <SubCat>2</SubCat> 
</items> 
... More items here 
</VacancyMatch> 

我想這個問題是數據是在同一水平?這是我第一次使用LINQ到XML,所以任何幫助都非常有用。 注: XML由第三方提供,因此格式取決於他們。

+0

謝謝你的回答都有幫助。似乎設置.value是解決方案。當我第一次嘗試它時它沒有工作:s,事實證明我沒有SLvl 0的任何項目,1是最低的。幸運的是沒有人注意到我的愚蠢:) – 2012-01-06 11:30:37

+1

是一個男人,並使用XPath – 2012-01-06 11:34:18

+1

我以前做過,這很痛苦:) – 2012-01-06 11:42:16

回答

9

.ToString()和使用.Value屬性,而不是:

var values = loaded.Descendants("items") 
    .Where(i => i.Element("SLvl").Value == "0") 
    .Select(i => i.Element("SearchTxt").Value) 
    .Distinct(); 

調用上的XElement ToString()將返回整個節點爲文本。舉例來說,如果我們在上面的查詢更改i.Element("SearchTxt").Valuei.Element("SearchTxt").ToString()它會生成一個字符串,如:

<SearchTxt>Accounting</SearchTxt> 

訪問Value屬性將提取節點的內部文本 - 「會計」在這種情況下。

+1

我想你也應該改變選擇子句中的ToString()來代替Value。 – 2012-01-06 11:12:33

+0

@ Kim.Net:謝謝,補充說明。 – 2012-01-06 11:20:45

3

此:

where c.Element("SLvl").ToString() == "0" 

應該是:

where c.Element("SLvl").Value == "0" 

你不能用 「的ToString()」 方法的元素的值,你需要閱讀它的 「值」 屬性代替。

對於任何其他您試圖獲取元素值的行也是如此。

希望它有幫助。