Не получается парсить XML

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Не получается парсить XML

Сообщение Pavel-Pugach » 06 апр 2015, 15:20

Пытаюсь спарсить xml файл и переписать данные оттуда в базу данных. Делаю это в методе onCreate в DBHelper-е, но почему то не получается.

Вот содержимое XML-ки:

Код: Выделить всё

<cats>
    <record
        title="Cалат Цезар з курячим філе" description="(Мікс салатів, томати конкасе, крутони, соус Цезар, куряче філе, сир Пармезан)" src="@drawable/salat_cezar_z_kuryachym_file2" category = "0" />
    <record
        title="Салат Лучано" description="(Мікс салатів, огірок, болг.перець, томати конкасе, шин. яловича, соус Вінегрет, 37грн грісіні)" src="@drawable/salat_luchano2" category = "0" />
    <record
        title="Крем-суп з печериць"  description=" " src="@drawable/krem_sup_z_pecheryts2" category = "1" />
    <record
        title="Бульйон з локшиною"  description=" " src="@drawable/bulyon_z_lokshynoyu2" category = "1" />
</cats>
Ниже кусок кода, который отвечает за парсинг в методе onCreate:

Код: Выделить всё

ContentValues cv = new ContentValues();
        Resources res = fContext.getResources();
        XmlResourceParser _xml = res.getXml(R.xml.cats_records);
        Log.d("myLogs", "before filling database");
        try{
            Log.d("myLogs", "geteventType");
            int eventType = _xml.getEventType();
            Log.d("myLogs", "while-if");
            while (eventType != XmlPullParser.END_DOCUMENT){
                Log.d("myLogs", "after while before if");
                if((eventType == XmlPullParser.START_TAG)&&(_xml.getName().equals("record"))){
                    Log.d("myLogs", "before reading attributes");
                    String title = _xml.getAttributeValue(0);
                    Log.d("myLogs", "title = "+title);
                    String description = _xml.getAttributeValue(1);
                    Log.d("myLogs", "description = "+description);
                    String image = _xml.getAttributeValue(2);
                    Log.d("myLogs", "image = "+image);
                    int category = _xml.getAttributeIntValue(3, 0);
                    Log.d("myLogs", "category = "+category);
                    cv.put("title", title);
                    cv.put("description", description);
                    cv.put("image", image);
                    cv.put("category", category);
                    Log.d("myLogs", "before inserting");
                    long idinsert = db.insert(TABLE_NAME, null, cv);
                    Log.d("MyLogs", "id записи: "+idinsert);
                }
                eventType = _xml.next();
            }
        } catch (XmlPullParserException e){
            Log.e("Test", e.getMessage(), e);
        }catch (IOException e){
            Log.e("Test", e.getMessage(), e);
        }finally {
            _xml.close();
        }
По логам видно, что выполняется блок while, после чего выполняется _xml.next(). И так 4 раза, пока не дойдет до END_TAG. Соответственно весь блок if(){} игнорируется. Не могу понять почему.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Не получается парсить XML

Сообщение doter.ua » 06 апр 2015, 16:02

Брейк поинт на строчке с ифом + алт+ Ф8 когда апликуха приостановится. Протестируй каждое условие по отдельности. (для Андроид Студии онли)
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Не получается парсить XML

Сообщение altwin » 06 апр 2015, 19:49

Pavel-Pugach писал(а):Соответственно весь блок if(){} игнорируется. Не могу понять почему.
значит условие игнорируется, попробуйте разделить это
[syntax=java5] if((eventType == XmlPullParser.START_TAG)
if(_xml.getName().equals("record")))[/syntax]
и добавьте лог чтобы определить что именно игнорируется и желательно вместо equals при парсинге использовать equalsIgnoreCase.

p.s. просто к слову, все эти _xml.getName() \ _xml.getAttributeValue(1) и т.д. лучше объявлять в начале блока, т.е. сразу после строки while (...), просто читать значительно удобнее. Да и привыкайте сразу переменным добавлять приставку (обычно используют m, т.е. mNewVar и т.д.), это своеобразное негласное соглашение в культурном обществе. В AS как и в idea должны быть настройки, которые позволят ставить префикс автоматически и не будут засорять имена методов доступа, это где то в настройках - Code Style \ Java и далее справа вкладка Code Generation, там выставив к примеру для Field - Name Prefix в m, а Static Field в s - ничего в своем стиле менять не придется, а разницу увидите сразу.
Изображение

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Не получается парсить XML

Сообщение Pavel-Pugach » 06 апр 2015, 20:39

Разделил два if и попробовал продебажить. Игнорировать начинает с первого условия if((eventType == XmlPullParser.START_TAG)

eventType при этом сначала =0, после первого прохода становится =1 и тд. Но я тогда не понимаю чем равен START_TAG.
altwin писал(а):p.s. просто к слову, все эти _xml.getName() \ _xml.getAttributeValue(1) и т.д. лучше объявлять в начале блока, т.е. сразу после строки while (...), просто читать значительно удобнее. Да и привыкайте сразу переменным добавлять приставку (обычно используют m, т.е. mNewVar и т.д.), это своеобразное негласное соглашение в культурном обществе. В AS как и в idea должны быть настройки, которые позволят ставить префикс автоматически и не будут засорять имена методов доступа, это где то в настройках - Code Style \ Java и далее справа вкладка Code Generation, там выставив к примеру для Field - Name Prefix в m, а Static Field в s - ничего в своем стиле менять не придется, а разницу увидите сразу.
Вы имеете ввиду без условий вообще?

Про приставку к переменным не знал, спасибо.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Не получается парсить XML

Сообщение doter.ua » 06 апр 2015, 21:03

Попробуй вначале вызвать _xml.next()
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Не получается парсить XML

Сообщение Pavel-Pugach » 06 апр 2015, 21:53

Попробовал вызвать _xml.next() до цыкла while, не помогло. Никогда не использовал до этого XMLPullParser по этому не знаю как он должен работать, делал по готовым примерам. По логике должно работать, но почему то не хочет оно находить START_TAG. Может с XML-файлом что то не так? Писал его сам с нуля, он расположен в папке res/xml и называется cats_records.xml

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: Не получается парсить XML

Сообщение Rustam » 06 апр 2015, 22:01

Pavel-Pugach писал(а):Попробовал вызвать _xml.next() до цыкла while, не помогло. Никогда не использовал до этого XMLPullParser по этому не знаю как он должен работать, делал по готовым примерам. По логике должно работать, но почему то не хочет оно находить START_TAG. Может с XML-файлом что то не так? Писал его сам с нуля, он расположен в папке res/xml и называется cats_records.xml
недавно работал с XML файлами при правке вручную какого-либо элемента при парсинге потом вылетала ошибка и ничего не помогало

в итоге пришлось собрать XML самим андроидом и потом этот файл уже использовать, когда редактируешь вручную, то добавляются какие-то спец символы.

Попробуй собрать XML в андроиде и потом спарсить

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Не получается парсить XML

Сообщение Pavel-Pugach » 06 апр 2015, 22:14

Rustam писал(а):
Pavel-Pugach писал(а):Попробовал вызвать _xml.next() до цыкла while, не помогло. Никогда не использовал до этого XMLPullParser по этому не знаю как он должен работать, делал по готовым примерам. По логике должно работать, но почему то не хочет оно находить START_TAG. Может с XML-файлом что то не так? Писал его сам с нуля, он расположен в папке res/xml и называется cats_records.xml
недавно работал с XML файлами при правке вручную какого-либо элемента при парсинге потом вылетала ошибка и ничего не помогало

в итоге пришлось собрать XML самим андроидом и потом этот файл уже использовать, когда редактируешь вручную, то добавляются какие-то спец символы.

Попробуй собрать XML в андроиде и потом спарсить
Что значит "собрать XML вручную"? Я его создавал из андроид студио и правил в ней же. Жмякал на папку в которой создавал ---> create XML... ---> прописывал атрибуты

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: Не получается парсить XML

Сообщение Rustam » 06 апр 2015, 22:28

Pavel-Pugach писал(а):
Rustam писал(а):
Pavel-Pugach писал(а):Попробовал вызвать _xml.next() до цыкла while, не помогло. Никогда не использовал до этого XMLPullParser по этому не знаю как он должен работать, делал по готовым примерам. По логике должно работать, но почему то не хочет оно находить START_TAG. Может с XML-файлом что то не так? Писал его сам с нуля, он расположен в папке res/xml и называется cats_records.xml
недавно работал с XML файлами при правке вручную какого-либо элемента при парсинге потом вылетала ошибка и ничего не помогало

в итоге пришлось собрать XML самим андроидом и потом этот файл уже использовать, когда редактируешь вручную, то добавляются какие-то спец символы.

Попробуй собрать XML в андроиде и потом спарсить
Что значит "собрать XML вручную"? Я его создавал из андроид студио и правил в ней же. Жмякал на папку в которой создавал ---> create XML... ---> прописывал атрибуты
я создавал с помощью XmlSerializer-а и потом кое что поправил вручную в блокноте - и все - не работает
может что и у тебя так

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Не получается парсить XML

Сообщение doter.ua » 06 апр 2015, 22:43

Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Не получается парсить XML

Сообщение Pavel-Pugach » 06 апр 2015, 22:55

Создал новый XML файл и скопировал туда данные. Подставил его и база наполнилась. Правда повылазили другие баги, но с ними дальше уже буду разбираться :) Отличия в файле в том, что есть тэг <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">Здесь атрибуты</PreferenceScreen>

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Не получается парсить XML

Сообщение altwin » 07 апр 2015, 00:14

Pavel-Pugach писал(а):Создал новый XML файл и скопировал туда данные. Подставил его и база наполнилась. Правда повылазили другие баги, но с ними дальше уже буду разбираться :) Отличия в файле в том, что есть тэг <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">Здесь атрибуты</PreferenceScreen>
Проблема действительно в xml (скорее всего), вы используете не сам XmlPullParser, а XmlResourceParser по сути тоже, но реализация под парсинг xml файлов из ресурсов android, вполне возможно, что файл не опознавался как ресурс и была странная ошибка.

Я вообще предпочитаю работать с json и даже если получить данные в нем не возможно мне проще конвертировать либо через сервис гугла либо в коде.
Изображение

Ответить