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

Я пытаюсь разобрать xml-файл с помощью LINQ, но, как я понимаю, запрос возвращает null. (Это 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,
                          };

«результат» — это строка xml, как и эта. http://i48.tinypic.com/1ex5s.jpg (не удалось опубликовать правильно отформатированный текст так вот фото :Р)

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

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


person Domas    schedule 13.10.2012    source источник


Ответы (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, но только тогда, когда элементы находятся в пространстве имен по умолчанию.

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

person driis    schedule 13.10.2012
comment
Большое спасибо за вашу помощь. Оказывается, это все, что мне было нужно XNamespace ns = doc.Name.Namespace; var resultQuery = from q in doc.Elements(ns + "Question") - person Domas; 13.10.2012

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

  1. Добавление корневого элемента было частью, так как Elements выполняет поиск только на одном уровне - XElement.Parse(result).Root.Elements("Question")
  2. Используйте метод Descendants, так как он будет выполнять поиск по всему дереву xml.
person Brad Semrad    schedule 13.10.2012