【问题标题】:LINQ to XML - Where clauseLINQ to XML - Where 子句
【发布时间】:2012-01-06 11:05:27
【问题描述】:

我有一个 XML 文件,其中包含 2 种类型的信息 - 由 SLvl 值确定的位置和工作类型。我希望将这些的 SearchTxt 值绑定到 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 由第三方提供,因此格式由他们决定。

【问题讨论】:

  • 感谢大家的回答都很有帮助。似乎设置 .value 是解决方案。当我第一次尝试它时它不起作用:s,结果我没有任何 SLvl 0 的项目,1 是最低的。幸好没有人注意到我的愚蠢:)
  • 我之前做过,很痛苦:)

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


【解决方案1】:

删除.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 属性将提取节点的内部文本 - “会计” 在这种情况下。

【讨论】:

  • 我猜你也应该将 select 子句中的 ToString() 改为 Value。
【解决方案2】:

这个:

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

应该是:

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

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

您尝试获取元素值的任何其他行也是如此。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    我注意到一个问题,您在 XElements 上使用 ToString(),这不是您想要的,我认为 :),使用 Value 属性获取 XElement 的文本内容。

    http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.value.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多