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
В документации класса есть несколько отличных примеров.
Два способа это исправить:
- Добавление корневого элемента было частью, так как элементы поиска только на одном уровне - XElement.Parse(результат).Root.Elements("Вопрос")
- Используйте метод Descendants, так как он будет искать все дерево XML.