Редактировать : Вот пример XML-документа, который я пытаюсь проанализировать: http://us.battle.net/wow/en/forum/1011699/ (просмотреть исходный код).
Вот элементы, которые я пытаюсь получить:
- Заголовок (tbody / tr / td / a)
- Автор (tbody / tr / td)
- Url (также хранится в узле автора)
- Дата (tbody / tr / td / div / div)
- Ответы (tbody / tr / td)
- Просмотры (также хранятся в вышеуказанном узле)
Я делаю «предварительный запрос», поэтому мне не нужно проходить как можно дальше для каждого следующего запроса:
var threads =
from allThreads in xmlThreadList.Descendants(ns + "tbody")
.Descendants(ns + "tr")
.Descendants(ns + "td")
select allThreads;
У меня есть документ XML, представляющий список тем форума,В каждом потоке есть разные дочерние элементы, которые содержат разную информацию, которую я хотел бы получить.В настоящее время я делаю это, запрашивая документ XML несколько раз.Есть ли способ извлечь эту информацию в одном запросе и сохранить ее в IEnumerable?То, как я делаю это сейчас, кажется неэффективным.
// array of xelements that contain the title and url
var threadTitles =
(from allThreads in threads.Descendants(ns + "a")
where allThreads.Parent.Attribute("class").Value.Equals("post-title")
select allThreads).ToArray();
// array of strings of author names
var threadAuthors =
(from allThreads in threads
where allThreads.Attribute("class").Value.Equals("post-author")
select allThreads.Value.Trim()).ToArray();
// ...
// there are several more queries like this
// ...
// for loop to populate a list with all the extracted data
for (int i = 0, j = 0; i < threadTitles.Length; i++, j++)
{
ThreadItem threadItem = new ThreadItem();
threadItem.Title = threadTitles[i].Value.Trim();
threadItem.Author = threadAuthors[i];
threadItem.Url = Path.Combine(_url, threadTitles[i].Attribute("href").Value);
threadItem.Date = threadDates[i];
threadItem.Replies = threadRepliesAndViews[j++];
threadItem.Views = threadRepliesAndViews[j];
_threads.Add(threadItem);
}
Любой совет будет оценен.Я новичок на всей сцене LINQ to XML.