LINQ to XML - Where子句

3
我有一个XML文件,其中包含两种类型的信息——位置和工作类型,由SLvl值确定。我希望将这些信息的SearchTxt值绑定到两个下拉列表(一个用于位置,一个用于工作类型),以便用作页面上的过滤器。
问题是我无法通过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 to XML,所以非常感谢任何帮助。 注意: XML由第三方提供,因此格式由他们决定。


谢谢大家提供的回答,都很有帮助。似乎设置.value就是解决方案。第一次尝试时它没起作用:s, 原来我没有任何 SLvl 0 的项目,1 是最低的。幸运的是,没有人注意到我的愚蠢 :) - benni_mac_b
1
我之前做过,那真是太痛苦了 :) - benni_mac_b
3个回答

11

去掉.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").Value 更改为 i.Element("SearchTxt").ToString(),它将生成类似于以下字符串:

<SearchTxt>Accounting</SearchTxt>

访问Value属性将提取节点的内部文本 - 在此示例中为"Accounting"


1
我猜你也应该将选择子句中的ToString()更改为Value。 - Kim.Net

3

This:

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

should be:

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

使用“ToString()”方法无法获取元素的值,您需要读取它的“Value”属性。

同样适用于任何其他尝试获取元素值的情况。

希望这有所帮助。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接