Pull to refresh

Чтение XML файла с помощью App Inventor

Reading time3 min
Views12K
Всем привет. Я хочу посвятить этот топик Google App Inventor (далее просто inventor), с которым, я думаю, вы знакомы по предыдущим топикам других людей. Его упрекают в малом функционале. Я тоже так считал, и когда он только запустился, я смог сделать только пару безделушек. Но, зайдя намедни в inventor, я был приятно удивлен, ведь в июньском обновлении добавилось множество интересных блоков, таких как:
Web, TinyWebDB, TinyDB, Notifier. В этом топике мы посмотрим, как можно прочитать XML файл, на примере получения кармы пользователя (использовать этот пример мне вздумалось после того, как один из пользователей написал топик про Python и SL4A). Интерфейс подробно рассматривать не будем, в нем легко разобраться и так.

Сначала покажу, какая схема у нас в итоге получится:
image

Добавление компонентов

Открываем в браузере страничку appinventor.googlelabs.com, создаем новый проект и добавляем на макет экрана вот такие компоненты:
Web, Notifier, Button, Label, TextBox, если надо, то изменяем надписи на них.
У меня получилось вот так:
image

Создание переменных

Откройте Block Editor (такая сверху справа кнопка) и начнем создавать блоки кода.
Сперва надо сделать две переменные: lworking и lCopyofWorking.
Создание переменных делается таким образом:
Слева переходим по вкладкам меню Built-InDefinition и перетаскиваем def variable на рабочую область. Обе переменные будут типом list, так что переходим в Built-InLists и перетаскиваем два раза make a list в переменные. После чего необходимо добавить в list переменной две item типа text (Built-InText) со значением > и <.
Вот что должно было получиться:


Обработка нажатия кнопки

Обработку нажатия кнопки можно найти в My BlocksButton1, этот блок называется Button1.Click. Перенесите его на рабочую область. Что будет выполняться нажатием? Надо сделать так, чтобы при нажатии на кнопку устанавливался url для запроса XML файла и посылался сам запрос. Для этого перейдите в My BlocksWeb1 и перетащите на рабочую область блоки set Web1.Url и call Web1.Get, после чего вставьте их в Button1.Click. Теперь необходимо сделать собсна сам url, для чего нам понадобятся блоки join (Built-InText), text (там же), в который надо вбить значение h ttp://habrahabr.ru/api/profile/ и TextBox1.Text (My BlocksTextBox1). Из их названия, думаю понятно, что они делают и в каком порядке их размещать. Вот как сделал я:


Получение и открытие XML

Добавьте на рабочую область блок Web1.GotText (My BlocksWeb1). Этот блок срабатывает, когда успешно выполняется команда Web1.Url и получается ответ от сервера.
Для начала необходимо разделить текст с помощью такой конструкции:

Первый блок устанавливает значение переменной (Она находиться в My BlocksMy Definitions).
Второй разделяет текст responseContent с использованием lCopyofWorking. (В результате полученный текст будет примерно login nick /login karma 66 /karma...).
После этого необходимо проверить, есть ли такой пользователь. Благодаря тому, что в случае неправильного написания имени пользователя, хабр возвращает файл с error, то мы можем легко проверить есть ли такой пользователь с помощью вот таких блоков:

Я думаю здесь все понятно с назначением блоков. ifelse располагается в Built-InControl. contains в Built-InText. global в My BlocksMy Definitions.
Теперь надо перебрать все пункты в листе lworking с помощью функции foreach (Built-InControl).
Вот как это выглядит:

Подставлять эту конструкцию надо в else-do.
Осталось только узнать: есть ли в текущем случае тег кармы и вывести его значение.
Узнать можно с помощью уже знакомого нам contains, if (находиться там же, где и ifelse), текста /karma и переменной sworkingitem2 примерно вот так:

Все! Осталось только вывести значение кармы, что мы будем делать с помощью функции Notifier1.ShowAlert (My BlocksNotifier1). С ней нет ничего сложного, поэтому мы только рассмотрим построение текста сообщения:
image
Как видите, у меня это дело получилось довольно громоздким. С join вы уже знакомы, на нем не будем останавливаться. А вот вторую часть надо бы разобрать.
select list item (Built-InLists), как понятно из названия, выбирает item из листа lworking. К аргументу index прикрепляем функцию вычитания (Built-InMath) в которой будет вычитаться из позиции текущего тега (/karma) переменная типа number (Built-In → Math) со значением 1. Функция определения позиции текущего тега называется position in list и располагается в Built-InLists.

Завершение

Соединяем наши блоки так, как показано в первом скриншоте и тестируем.

Как видите, на самом деле App Inventor не такая уж и безделушка, которая, с первого взгляда, годиться только для создания мяукающей кошки.
Урок, с которого была сделана эта статья
Скачать приложение:
image
Tags:
Hubs:
+13
Comments7

Articles