我有一个包含两种类型信息的 XML 文件 - 位置和作业类型,这由 SLvl
值确定。我希望将这些的 SearchTxt
值绑定(bind)到 2 个下拉菜单(一个用于位置,一个用于工作类型)以用作我页面上的过滤器。
问题是我不能完全让我的 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 由第三方提供,因此格式由他们决定。
最佳答案
删除 .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”。
关于c# - LINQ to XML - Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8756888/