XML LINQ-запрос ничего не возвращает

Я пытаюсь проанализировать XML-файл с помощью LINQ, но, как я понимаю, запрос возвращает ноль. (Это WP7) Вот код:

       var resultQuery = from q in XElement.Parse(result).Elements("Question")
                          select new Question
                          {
                              QuestionId = q.Attribute("id").Value,
                              Type = q.Element("Question").Attribute("type").Value,
                              Subject = q.Element("Subject").Value,
                              Content = q.Element("Content").Value,
                              Date = q.Element("Date").Value,
                              Timestamp = q.Element("Timestamp").Value,
                              Link = q.Element("Link").Value,
                              CategoryId = q.Element("Category").Attribute("id").Value,
                              UserId = q.Element("UserId").Value,
                              UserNick = q.Element("UserNick").Value,
                              UserPhotoURL = q.Element("UserPhotoURL").Value,
                              NumAnswers = q.Element("NumAnswers").Value,
                              NumComments = q.Element("NumComments").Value,
                          };

"result" - это строка XML, как и эта. http://i48.tinypic.com/1ex5s.jpg (не удалось опубликовать должным образом отформатированный текст, поэтому вот картинка: P)

Ошибка: http://i48.tinypic.com/2uyk2ok.jpg

Извините, если я не объяснил это должным образом и если это уже было задано (попытался найти, но не помогло).

2 ответа

Решение

Вы столкнулись с проблемой пространства имен XML. Когда вы просто запрашиваете "Вопрос", строка переводится в XName с пространством имен по умолчанию. Нет элементов в пространстве имен по умолчанию в вашем XML, только элементы в urn:yahoo:answers пространство имен (см. элемент верхнего уровня, где он говорит xmlns="urn:yahoo:answers").

Вам нужно запросить правильное пространство имен XML, например так:

var ns = new XNameSpace("urn:yahoo:answers");
var resultQuery = from q in XElement.Parse(result).Elements(ns + "Question");

Выбирая отдельные свойства, не забудьте также добавить пространство имен.

XName это класс, который представляет имя XML, которое может иметь пространство имен, определенное XNameSpace, Эти два класса имеют реализованный оператор неявного преобразования, который позволяет вам неявно преобразовывать из string в XName, Это причина, по которой звонки работают, просто указав string name, но только когда элементы находятся в пространстве имен по умолчанию.

Неявность этого упрощает работу с пространствами имен XML, но когда человек не знает механизма, стоящего за этим, он очень быстро запутывается. XName В документации класса есть несколько отличных примеров.

Два способа это исправить:

  1. Добавление корневого элемента было частью, так как элементы поиска только на одном уровне - XElement.Parse(результат).Root.Elements("Вопрос")
  2. Используйте метод Descendants, так как он будет искать все дерево XML.
Другие вопросы по тегам