2012-01-06 47 views
2

私は2種類の情報を持つXMLファイルを持っています - 場所とジョブの種類はSLvlの値で決定されます。私はSearchTxtの値を2つのドロップダウン(1つは場所用、1つは職種用)にバインドして、自分のページのフィルターとして使用したいと考えています。LINQ to XML - Where句

問題は、SLvlの値をフィルタリングするために私のwhere節をかなり取得できないという問題です。 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 to XMLを初めて使用したので、どのような助けも大いに喜んでいます。 注: XMLはサードパーティより提供され、したがって、ユーザーはフォーマットすることができます。

+0

回答ありがとうございました。 .valueという設定が解決策だったようだ。私が最初にそれを試したとき、それは仕事をしませんでした:sは、SLvl 0のアイテムを持っていません。ありがたいことに、誰も私の愚かさに気付いた:) –

+1

XPath –

+1

私は先に行った、それは痛いです:) –

答えて

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").ToString()に上記のクエリでi.Element("SearchTxt").Valueを変更した場合、それはのような文字列を生成します: - この場合には「会計」

<SearchTxt>Accounting</SearchTxt> 

Valueプロパティにアクセスすると、ノードの内部テキストを抽出します。

+1

私は推測する必要がありますToString()を変更する必要があります。 –

+0

@ Kim.Net:ありがとう、それについてのノートを追加しました。 –

3

この:

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

は次のようになります。あなたは "ToStringメソッド()" メソッドで要素の値を取得することはできません

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

、あなたはそれが "値" プロパティの読み取りに必要代わりに。

同じことは、要素の値を取得しようとしている他の行にも適用されます。

希望します。