c# - LINQ to XML - Where 子句

标签 c# asp.net xml linq-to-xml

我有一个包含两种类型信息的 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/

相关文章:

c# - C# 中的实数舍入不一致

asp.net - 为什么 SSL 443 无法在 IIS Express 中为 Visual Studio Web 项目的自定义域工作?

asp.net - Microsoft.Extensions.Logging 如何在完整的 .net 框架中工作?

xml - 单个 RSS xml 中的多个 channel - 它是否合适?

xml - 是数字,在 XPath 或 XSL 中是字母/数字

python - 如何将可能格式错误的 xml 解析为数据框?

c# - 为什么关闭最后一个子窗口会最小化其父窗口?

c# - .Net C# ReadProcessMemory指针函数向后返回地址

asp.net - Windows 身份验证是否可能不提示用户输入凭据?

c# - 如何强制 XDocument 以大写形式输出序言,同时保留缩进和格式?