условие в linqToXml - PullRequest
       24

условие в linqToXml

2 голосов
/ 21 марта 2011

XML

<Questions>
   <Question>
      <Id>1</Id>
      <Text>aaa</Text>
    </Question>
    <Question>
      <Id>2</Id>
      <Text>bbb</Text>
   </Question>
</Questions>

код

question="aaa";

var doc = XDocument.Load(Server.MapPath(".") + "\\Questions.xml");
        var elements = from element in doc.Descendants("Question")
                       let txt = element.Element("Text")
                       where question.CompareTo (txt)==0 
                       select new
                       {
                           Id = element.Element("Id").Value,
                       };

Этот код elements.count () ==> 0

Я хотел бы, чтобы выбрать из XML, где txt=='aaa'

1 Ответ

1 голос
/ 21 марта 2011

Строка let txt = element.Element("Text") возвращает XElement вместо текста, поэтому ваше условие CompareTo взорвется вместо проверки текстовых значений.

Вместо этого вы можете получить значение узла через свойство .Value.

...
let txt = element.Element("Text").Value
...

Строка var elements = from element in doc.Descendants("Question") будет успешно искать элементы, но в качестве практики вы можете перейти от корневого узла или относительной иерархии.

...
var elements = from element in doc.Root.Descendants("Question")
...

Остальная часть кода выглядит нормально (меньше обработки исключений).

У меня сработало следующее ...

string xml = @"<Questions>
   <Question>
      <Id>1</Id>
      <Text>aaa</Text>
    </Question>
    <Question>
      <Id>2</Id>
      <Text>bbb</Text>
   </Question>
</Questions>";

string question = @"aaa";
var doc = XDocument.Parse(xml);
var elements = from element in doc.Root.Descendants("Question")
           let txt = element.Element("Text").Value
           where question.CompareTo(txt)==0 
           select new
           {
               Id = element.Element("Id").Value,
           };

Console.WriteLine(elements.Count()); //1
...