locked
API ВК, парсинг XML C# часть 2 RRS feed

  • Вопрос

  • В самый первый раз (http://social.msdn.microsoft.com/Forums/ru-RU/winstoreappsru/thread/ece22adc-d5d9-4c4e-b6ea-a6c4fc93f1a2) я получил очень хороший ответ и решил получать содержимое произвольного поста через регулярные выражения т.к. был более менее знаком с ними, но вот незадача: Всё это:

                string posts = "<response><post>текст 1</post><post>текст 2</post><post>текст 3</post></response>";
                Regex reg = new Regex(@"<post>[\w*\s*]*</post>");
                MatchCollection resuts = reg.Matches(posts);
                string second_post = resuts[1].Value;
                Text.Text = second_post;

    и это

                    string ans = await httpClient.GetStringAsync(Uri);

                    Text.Text = ans;

    работает хорошо, но это отказывается работать:

                    string ans = await httpClient.GetStringAsync(Uri);
                    Regex reg = new Regex(@"<post>[\w*\s*]*</post>");
                    MatchCollection resuts = reg.Matches(ans);
                    string second_post = resuts[1].Value;
                    Text.Text = second_post;

    Почему????

    P.S. Если нужен ответ от сервера (строка ans) он здесь: http://sdrv.ms/V9RGhK

      
    17 января 2013 г. 16:38

Ответы

  • Что-то сложное придумывать лень, будет работать вот такой синтаксис:

    Regex reg = new Regex("<post>(.*?)</post>");
    MatchCollection matches = reg.Matches(ans.Replace("\n", ""));

    Но, я бы решал эту задачу при помощи тех средств, которые ориентированны на работу с XML. Как, например, вам показали в предыдущем топике.
    17 января 2013 г. 18:27
    Отвечающий
  • Не учитывались переносы строк, нет обработки символов <, =, ", /> и других, которые у вас могли находиться между открывающимся и закрывающимся тэгом.

    • Помечено в качестве ответа Anton Nikishin 18 января 2013 г. 6:16
    18 января 2013 г. 3:15
    Отвечающий

Все ответы

  • Что-то сложное придумывать лень, будет работать вот такой синтаксис:

    Regex reg = new Regex("<post>(.*?)</post>");
    MatchCollection matches = reg.Matches(ans.Replace("\n", ""));

    Но, я бы решал эту задачу при помощи тех средств, которые ориентированны на работу с XML. Как, например, вам показали в предыдущем топике.
    17 января 2013 г. 18:27
    Отвечающий
  • Спасибо вам большое за проделанную для меня работу.

    Я тоже так думал и многое попробовал (большие надежды возлогал на XPath и думал, что он мне поможет, но как только дошло до дела, я обломался, в Win Store приложениях отключили его поддержку), ну а затем посмотрев на тот код из прошлой статьи я решил испробовать его, но он мне выдал ошибку о недостатке прав доступа, да и к тому же я почему-то посчитал это способ достаточно ресурсоёмким и подумал, что он будет долго исполнятся на медленных планшетах.

    Кстати, в чём заключалась моя ошибка в данном коде:

                    string ans = await httpClient.GetStringAsync(Uri);
                    Regex reg = new Regex(@"<post>[\w*\s*]*</post>");
                    MatchCollection resuts = reg.Matches(ans);
                    string second_post = resuts[1].Value;
                    Text.Text = second_post;

    ????

    17 января 2013 г. 19:16
  • Не учитывались переносы строк, нет обработки символов <, =, ", /> и других, которые у вас могли находиться между открывающимся и закрывающимся тэгом.

    • Помечено в качестве ответа Anton Nikishin 18 января 2013 г. 6:16
    18 января 2013 г. 3:15
    Отвечающий
  • Привет

    А почему вы вообще используете регулярные выражения в работе с API? Там же можно выбрать формат json, а потом этот json распарсить с помощью специальной библиотеки JSON.NET, и сразу получить желаемый результат, без изобретения своих велосипедов.

    Плюсом json является и то, что он менее избыточен (т.е. меньший трафик будет передаваться между api и вашим клиентом)

    Мне кажется у вас ошибка в подходе работы с API.


    Для связи [mail]

    18 января 2013 г. 7:45