Comments 31
Что-то я ни одного метода LINQ не увидел. Правильнее было бы назвать API Вконтакте и XDocument.
+6
foreach
со вложенным if
вместо Where/Select
— это тошнотворно, конечно.+8
Может быть. Но я писал так, как смог бы понять, если бы занимался этим впервые, не зная LINQ.
+1
Не зная LINQ — через XPath (хотя я бы и сейчас писал через XPath).
А зачем иначе-то писать?
А зачем иначе-то писать?
+1
А это уже читатель сможет сделать потом. Я же не прошу все время использовать такие примитивные конструкции, как в этом примере. Это для того, чтобы «пощупать» .xml и явно вытащить из него все, что нужно.
0
А зачем это может быть нужно и кому?
Чтобы «пощупать» xml, достаточно на него один раз посмотреть.
Чтобы «пощупать» xml, достаточно на него один раз посмотреть.
+1
Наверное тем людям, которые не знают LINQ, но хотят любым понятным способом начать работать с API ВКонтакте. Я просто пытался уменьшить порог вхождения.
-1
Людям, которые не умеют работать ни с LINQ, ни с XPath, надо сначала научиться работать с этими технологиями, а только потом взаимодействовать с API сторонних сервисов.
(на всякий случай напомню, что речь идет в контексте C#)
(на всякий случай напомню, что речь идет в контексте C#)
+2
Полностью согласен, но незнание этих технологий не мешает понимать такие простые вещи. А потом, если надо будет, можно использовать специальные для этого инструменты.
0
А что тут понимать?
+1
получить все сообщения с пользователем, обработать узлы xml
Это тоже самое, что изучать Лого. Вроде все понятно, но для первого знакомства (конечно, я говорю про детей) подойдет.
0
Мне интересная тема поста, спасибо большое. Но, кроме понимания, мне было бы интересно увидеть как это писать правильно. Могли бы вы написать вариант с использованием LINQ to XML, так сказать, для сравнения?
0
Я почему-то текст на вашей картинке прочитал как XML+C≠♥
0
Спасибо за статью!
> Пожалуйста, указывайте на любые недочеты в статье. Буду учиться.
Я позволил себе последний код чуть чуть оптимизировать:
А для не совсем маленьких, так же сделал linq вариант:
Можно так же еще сделать десериализацию данных без ручного разбора — но в рамках этой задачи наверное смысла нет.
> Пожалуйста, указывайте на любые недочеты в статье. Буду учиться.
Я позволил себе последний код чуть чуть оптимизировать:
while(true)
{
var doc = XDocument.Load("https://api.vk.com/method/messages.getHistory.xml?uid=12345&offset=" + m + "&count="+n+"&access_token=" + token);// Загружаем наш xml с сервера и начнем обработку
foreach (var el in doc.Root.Elements("message"))// Раскрываем корневой узел
{
foreach (var el_msg in el.Elements("attachment"))// Теперь в узле message
{
foreach (var el_attch in el_msg.Elements("photo"))
{
foreach (var el_photo in el_attch.Elements("src_xbig"))
{
// Скачиваем фотографию в img/
src_client.DownloadFile(el_photo.Value, "img/img" + k + ".jpg");
k++;
}
}
}
}
// Ну и конечно увеличение параметра count
m += n;
}
А для не совсем маленьких, так же сделал linq вариант:
while (true)
{
var doc = XDocument.Load("https://api.vk.com/method/messages.getHistory.xml?uid=12345&offset=" + m + "&count=" + n + "&access_token=" + token);// Загружаем наш xml с сервера и начнем обработку
var photoElements=
doc.Root.Elements("message")
.SelectMany(el => el.Elements("attachment")
.SelectMany(el_msg => el_msg.Elements("photo")
.SelectMany(elAttch => elAttch.Elements("src_xbig"))));
foreach (var el_photo in photoElements)
{
// Скачиваем фотографию в img/
src_client.DownloadFile(el_photo.Value, "img/img" + k + ".jpg");
k++;
}
// Ну и конечно увеличение параметра count
m += n;
}
Можно так же еще сделать десериализацию данных без ручного разбора — но в рамках этой задачи наверное смысла нет.
+4
Мне кажется, или тут достаточно одного XPath-запроса? Дайте посмотреть на приходящий XML.
+3
Вам не кажется.
+3
Спасибо. Специально для любителей XPath, написал вариант с ним.
0
Я б писал как-то так:
using System;
using System.Linq;
using System.Net;
using System.Xml.Linq;
using System.Xml.XPath;
namespace Test
{
class Program
{
private readonly WebClient _webClient = new WebClient();
public string Token
{
get { return "token"; }
}
public string UserID
{
get { return "uid"; }
}
public string XQueryString
{
get { return "//message//attachment//photo//src_big"; }
}
static void Main()
{
new Program().Run();
}
private void Run()
{
const int offset = 0, count = 10;
var url = MakeUrl(UserID, offset, count, Token);
var doc = XDocument.Load(url);
var els = doc.XPathSelectElements(XQueryString);
foreach (var t in els.Select((val, index) => new { val.Value, Index = index }))
{
_webClient.DownloadFileAsync(new Uri(t.Value), string.Format("img/img{0}.jpg", t.Index));
}
}
private string MakeUrl(string uid, int offset, int count, string token)
{
const string queryFormatString =
"https://api.vk.com/method/messages.getHistory.xml?uid={0}&offset={1}&count={2}&access_token={3}";
return string.Format(queryFormatString, uid, offset, count, token);
}
}
}
0
А смысл xml использовать, если некоторые методы типа execute все равно возращают json, который, к слову, более удобен для работы.
+1
Часто ли приходится обрабатывать капчу вконтакте?
0
Почему Вы не использовали XML сериализацию?
0
Sign up to leave a comment.
API ВКонтакте и XDocument для самых маленьких