XML:
<root>
<item>
<href>http://myurl</href>
</item>
<item>
<href>http://myurl2</href>
</item>
</root>
Данные XML хранятся в таблице базы данных.
Могу ли я создать запрос Linq, который выбирает строки, извлекает XML, а затем, например, извлекает все теги href ?Конечным результатом будет список всех URL-адресов для всех выбранных строк.
Это моя попытка, но она не дает мне того, что я хочу, а список всех ссылок для всех выбранных пользователей.Я просто получаю список пустых IEnumerations.
var all = from bm in MYTABLE
select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
Решение
Было 2 проблемы.
- Я полагаю, что запрос выполняется только тогда, когда результат действительно требуется.По мере того как я переходил от SQL к XML-запросу, полученный запрос стал смесью SQL и XML и, следовательно, неисполнимым.Мое решение состояло в том, чтобы форсировать результат путем преобразования запроса SQL в список результатов.Это отделяло linq-sql от linq-xml.
var docs = from x in all
select XDocument.Parse(x.xml);
var docs2 = docs.ToList(); // force result
- Вторая проблема заключалась в том, что я забыл добавить пространство имен в мой XML-запрос.Как только я это сделал, я получил требуемый результат
XNamespace ns = "http://acme/bookmarks";
var href = from h in docs2
select h.Descendants(ns + "href");
Спасибо за вашу помощь!