Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
1

Парсинг XML URL

10.04.2018, 08:25. Просмотров 399. Ответов 8
Метки нет (Все метки)

Нужно распарсить XML страницу имея Апи ключ, в инструкции АПИ сказано: "Для идентификации API запросов необходимо передавать ключ через
HTTP заголовок “X-AppId”
"

Чем лучше парсить, как правильно передавать ключ и как правильно реализовывать такой запрос. Спасибо.
И как посмотреть структуру ответа из браузера если такое возможно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2018, 08:25
Ответы с готовыми решениями:

Парсинг XML по URL
Нужно взять строку из тега <company> отсюда xml. Можно как-то обойтись без циклов?

Парсинг XML документа по URL
Нужно пропарсить XML документ: http://qps.ru/7UzLc Как я понимаю, есть три варианта: 1) скачать...

Парсинг XML
Пробую так String data = getIntent().getStringExtra("data"); try { ...

Парсинг XML
try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); ...

Парсинг XML
Решил освоить Android написал первое приложение(программка расшифровывает статус контролера...

8
ExFau$t
729 / 603 / 148
Регистрация: 08.05.2012
Сообщений: 2,936
10.04.2018, 13:03 2
Не знаю, как круто и супер правильно делать, я кидаю ключ и базовый url в BuildConfig через градле. Реализация запроса зависит о того, что ты куришь. Хедеры закидывать поддерживает любая библиотека для запросов. Ну а запросы слать и ответы видеть, если расширение в браузер не охота качать, то есть куча онлайн-сервисов. Например, вот.
1
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
10.04.2018, 16:13  [ТС] 3
Спасибо, все по делу. Использовал "хурл " он не правильно отдает почему то и бесконечная капча, перешел на hurl.quickblox все начало работать как мы любим, виден ответ итд все понятно.
Такой вопрос, чем можете все таки порекомендовать разбирать xml для дилетанта?
0
ExFau$t
729 / 603 / 148
Регистрация: 08.05.2012
Сообщений: 2,936
10.04.2018, 16:48 4
Чтобы рекомендовать, надо успеть всё попробовать. Я всё не пробовал, я доверяю в этом плане ретрофиту. То есть, например, делаю какой-то запрос в браузере, копирую оттуда весь json /xml, генерирую от него pojo, можно извне, можно в студии, затем к переменным дописываю аннотации @SerializedName и всё.

Добавлено через 4 минуты
Генерить извне можно здесь. Но есть несколько минусов, первое - там генерятся массивы объектов, вместо листов, это характерно для корневого элемента, в который вложен массив. Также он будет генерить тупо по именам параметров в запросе, а имена там могут быть далеки от конвенций.

Добавлено через 2 минуты
Но удобно в плане не ковырять здоровый json и не списывать переменные в модель по одной в студии, а получить сразу все классы моделей, которые можно через поиск подредактировать в студии и уже там что-нибудь подгенерить опционально.
1
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
13.04.2018, 07:46  [ТС] 5
Иду от простого, начинаю с XML PullParser.

Вопрос:
у меня XML такого вида:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<data>
    <e>
        <message>
        </message>
    </e>
    <from>
        <id>
            487
        </id>
      </to>
    <routes>
        <item>
            <index>0</index>
            <from_date_part>from_night</from_date_part>
            <to_date_part>to_morning</to_date_part>
            <info/>           
        </item>
        <item>
            <index>0</index>
            <from_date_part>from_night</from_date_part>
            <to_date_part>to_morning</to_date_part>
            <info/>           
        </item>
 
         <item>
            <index>0</index>
            <from_date_part>from_night</from_date_part>
            <to_date_part>to_morning</to_date_part>
            <info/>           
        </item>
</routes>
</data>
Но мне нужна выборка только тега </routes> и там читать все <item> их может быть несколько.


делаю лист вью но он почему то? читает только последний <item>, почему так?


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class XmlPullParserHandler {
    private List<Employee> employees= new ArrayList<Employee>();
    private Employee employee;
    private String text;
 
    public List<Employee> getEmployees() {
        return employees;
    }
 
    public List<Employee> parse(InputStream is) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser  parser = factory.newPullParser();
 
           // parser.setInput(is, null); //было так
            parser.setInput(is, "UTF-8");
            // parser.setInput(getInputStream(url), "UTF-8");
 
            int eventType = parser.getEventType();
 
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = parser.getName();
 
                if (eventType == XmlPullParser.START_TAG) {
                        if (tagname.equalsIgnoreCase("routes")) {
                            // create a new instance of employee
                            employee = new Employee();
                        }
 
                }
 
                if (eventType == XmlPullParser.TEXT) {
                    text = parser.getText();
                }
 
                if (eventType ==  XmlPullParser.END_TAG) {
 
                    if (tagname.equalsIgnoreCase("item")) {
                        // add employee object to list
                        employees.add(employee);
                    } else if (tagname.equalsIgnoreCase("index")) {
                        employee.setId(text);
                    } else if (tagname.equalsIgnoreCase("from_date_part")) {
                        employee.setName(text);
                    } else if (tagname.equalsIgnoreCase("to_date_part")) {
                        employee.setSalary(text);
                    }
                }
 
                eventType = parser.next();
            }
 
        } catch (XmlPullParserException | IOException e)
        {e.printStackTrace();}
 
        return employees;
    }
 
    
}
и еще вопрос почему иногда текст отдает null

Добавлено через 9 минут
К слову с несложными XML вопросов нету
0
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
16.04.2018, 17:24  [ТС] 6
Подскажите такой вопрос, начал изучать ретрофит, если мне не нужны некоторые поля в получаемом XML документе, нужно ли генерить для них pojo?
0
ExFau$t
729 / 603 / 148
Регистрация: 08.05.2012
Сообщений: 2,936
16.04.2018, 17:59 7
Нет, сеттеры и геттеры тоже. В любом случае, проще попробовать, чем ждать ответа.
0
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
19.04.2018, 07:34  [ТС] 8
Посмотрите люди знающие что не правильно?
В качестве учебного примера XML пытаюсь ретрофитом разобрать вот такую ссылку:
курсы валют

И почему то не выходит(

Вот такой интерфейс:
Java
1
2
3
4
5
// http://www.nbrb.by/Services/XmlExRates.aspx?
public interface ProductAPI {
    @GET("/Services/XmlExRates.aspx?")
    Call<Responce> getProducts();
}
такой вот класс Responce
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Root(name = "DailyExRates", strict = false)
public class Responce {
    @ElementList(inline = true)
    public List<Product> products;
}
 
@Root(name = "Currency")
class Product {
    @Element(name = "Id")
    private String Id;
    @Element(name = "NumCode")
    private String NumCode;
    @Element(name = "CharCode")
    private String CharCode;
 
    @Element(name = "Scale")
    private String Scale;
    @Element(name = "Name")
    private String Name;
    @Element(name = "Rate")
    private String Rate;
Вот сам запрос:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void getProducts(){
        final ProgressDialog loading = ProgressDialog.show(this,"Fetching Data","Please wait...",false,false);
 
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.nbrb.by/")
                .client(new OkHttpClient())
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .build();
 
        ProductAPI api = retrofit.create(ProductAPI.class);
 
        Call<Responce> call = api.getProducts();
        call.enqueue(new Callback<Responce>() {
            @Override
            public void onResponse(@NonNull Call<Responce> call, @NonNull Response<Responce> response) {
                kk = response.body().products;
                ArrayList<Product> p = new ArrayList<>(kk);
                adapter = new MyRvAdapter(p,getApplicationContext());
                recyclerView.setAdapter(adapter);
                loading.dismiss();
            }
 
            @Override
            public void onFailure(Call<Responce> call, Throwable t) {
                loading.dismiss();
                System.out.println(t.getLocalizedMessage());
            }
        });
 
 
    }
0
VASSUV
MiThEoN
443 / 307 / 35
Регистрация: 31.10.2009
Сообщений: 505
Записей в блоге: 2
Завершенные тесты: 1
19.04.2018, 11:08 9
Может кому-то покажется глупо, но когда мне пришлось работать в одном проекте с несколькими серверами, которые присылают разные форматы ответов, где-то Json, где-то XML. Я подсчитал что лучше для меня будет в приложении работать с одним форматом - JSON. Я написал простенький парсер XmlToJson

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
public class XmlParser {
    public static final String XML_PARSER = "XmlParser";
    public static final String VALUE = "value";
    @Inject
    Logger logger;
 
    private XmlPullParser parser;
    private int eventType;
 
    public XmlParser() {
        App.getComponent().inject(this);
    }
 
    public JsonValue parse(String text) {
        try {
            parser = XmlPullParserFactory.newInstance().newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(new StringReader(text));
            final JsonValue value = getJsonValue();
            logger.log(XML_PARSER, value);
            return value;
        } catch (Exception e) {
            logger.logExc(XML_PARSER, e);
            return new JsonObject();
        }
    }
 
    private JsonValue getJsonValue() throws XmlPullParserException, IOException {
        final JsonObject value = new JsonObject();
        JsonValue tempValue;
        String tempString;
        for (int i = 0; i < parser.getAttributeCount(); i++) {
            value.add("@" + parser.getAttributeName(i), parser.getAttributeValue(i));
        }
        eventType = parser.next();
        while (true) {
            switch (eventType) {
                case XmlPullParser.TEXT:
                    final String text = parser.getText().trim();
                    eventType = parser.next();
 
                    if (text.isEmpty()) continue;
 
                    if (value.names().isEmpty())
                        return new JsonString(text);
                    else
                        return value.add(VALUE, text);
 
                case XmlPullParser.START_TAG:
                    tempString = parser.getName();
                    tempValue = getJsonValue();
 
                    if (tempString == null || tempValue == null)
                        break;
 
                    if (value.get(tempString) != null) {
                        final JsonValue oldValue = value.get(tempString);
                        if (oldValue.isArray()) {
                            oldValue.asArray().add(tempValue);
                        } else {
                            value.set(tempString, new JsonArray().add(oldValue).add(tempValue));
                        }
 
                    } else {
                        value.asObject().add(tempString, tempValue);
                    }
 
                    if (eventType == XmlPullParser.END_TAG)
                        eventType = parser.next();
 
                    continue;
            }
            break;
        }
        return value;
    }
}
Решение меня полностью устроило, и я снова забыл что такое XML
0
19.04.2018, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2018, 11:08

Парсинг XML
Нужно роспарсить XML, который приходть с http://shop.podolyany.com.ua/api/rest/products/. Наверное...

Парсинг XML на АНДРОИД
Суть приложения - парсит XML файл с сервера ( извлекает значение тега &lt;bid&gt;). Выводит это значение...

XML HTTP парсинг
Здравствуйте. На сервере есть тестовый php файл с сontent-type: text/xml. Он выводит сообщения с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru