Страница 1 из 1

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

Добавлено: 06 апр 2015, 15:20
Pavel-Pugach
Пытаюсь спарсить 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(){} игнорируется. Не могу понять почему.

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

Добавлено: 06 апр 2015, 16:02
doter.ua
Брейк поинт на строчке с ифом + алт+ Ф8 когда апликуха приостановится. Протестируй каждое условие по отдельности. (для Андроид Студии онли)

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

Добавлено: 06 апр 2015, 19:49
altwin
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 - ничего в своем стиле менять не придется, а разницу увидите сразу.

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

Добавлено: 06 апр 2015, 20:39
Pavel-Pugach
Разделил два 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 - ничего в своем стиле менять не придется, а разницу увидите сразу.
Вы имеете ввиду без условий вообще?

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

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

Добавлено: 06 апр 2015, 21:03
doter.ua
Попробуй вначале вызвать _xml.next()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 06 апр 2015, 22:43
doter.ua

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

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

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

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

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