LINQ to XML - предложение Where - PullRequest
2 голосов
/ 06 января 2012

У меня есть XML-файл с 2 типами информации - местоположения и типы заданий, которые определяются значением 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 предоставляется третьей стороной, поэтому форматирование зависит от них.

Ответы [ 3 ]

10 голосов
/ 06 января 2012

Удалите .ToString() и используйте вместо него свойство .Value:

var values = loaded.Descendants("items")
    .Where(i => i.Element("SLvl").Value == "0")
    .Select(i => i.Element("SearchTxt").Value)
    .Distinct();

Вызов ToString() в XElement вернет весь узел в виде текста. Например, если мы изменим i.Element("SearchTxt").Value в приведенном выше запросе на i.Element("SearchTxt").ToString(), это приведет к появлению таких строк, как:

<SearchTxt>Accounting</SearchTxt>

При доступе к свойству Value будет извлечен внутренний текст узла - «Учет» * в этом случае .

3 голосов
/ 06 января 2012

Это:

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

должно быть:

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

Вы не можете получить значение элемента с помощью метода "ToString ()", вместо этого вам нужно прочитать его свойство "Value".

То же самое относится и к любым другим строкам, где вы пытаетесь получить значение элемента.

Надеюсь, это поможет.

1 голос
/ 06 января 2012

Я заметил одну проблему: вы используете ToString () для XElements, что не совсем то, что вам нужно, я думаю :), чтобы получить текстовое содержимое XElement, используйте свойство Value.

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

...