Как разобрать XML (конкретную структуру) в Android?

Мне нужно разобрать определенную часть XML, полученного из http-запроса, но я не знаю, как это сделать!

У меня возвращается следующая структура XML:

<categorias type="array">
    <categoria>
        <nome>
        Alimentação
        </nome>
        <idcategoria>
        5
        </idcategoria>
        <subcategorias>
            <subcategoria>
                <nome>
                Todos
                </nome>
                <id>
                5
                </id>
            </subcategoria>
        </subcategorias>
    </categoria>
</categorias>

Мне нужно проанализировать данные внутри тега subcategorias, потому что с кодом, который у меня есть сейчас, я получаю только верхние теги, такие как nome и idcategoria, из категории корневого тега.

Я создал NodeList внутри цикла for, но он возвращает все теги подкатегории в документе. И мне нужно получить только те, которые находятся внутри уникального тега категории. Вот код, который у меня есть сейчас:

menuItems = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_ITEM);

    // looping through all item nodes <item>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_ID, parser.getValue(e, KEY_ID));
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));

        // adding HashList to ArrayList
        menuItems.add(map);
    }

Может ли кто-нибудь помочь мне в этом!?

Заранее спасибо!


person CainaSouza    schedule 28.06.2012    source источник
comment
Мне нужно проанализировать данные внутри тега — какие данные внутри какого тега?   -  person you786    schedule 28.06.2012
comment
Примечание: ваши комментарии немного излишни, не так ли? :)   -  person you786    schedule 29.06.2012


Ответы (4)


Взгляните на этот официальный документ Android, в котором описывается XMLPullParser.

Вы должны реализовать свою логику в соответствии со структурой XML.

person rajpara    schedule 28.06.2012

Помимо XMLPullParser, другим вариантом анализа XML является использование библиотеки Simple XML. Это позволит вам легко десериализовать этот XML в объект, которым вы можете манипулировать по своему усмотрению. Вы могли бы игнорировать все другие дочерние элементы в категории и просто захватить подкатегории, используя свободное сопоставление объектов. Дополнительные сведения см. в документации Simple Framework.

person TJ Thind    schedule 28.06.2012

@Android Coader прав: «Вы должны реализовать свою логику в соответствии со своей структурой XML»

Почему у вас есть KEY_ITEM, когда в вашем XML нет тегов «item»? Вам нужно указать в коде, какие теги вы хотите получить. Например, если вы определяете KEY_SUBCATEGORIA = "subcategoria", то для получения всех узлов подкатегории вы можете сделать

NodeList nl = doc.getElementsByTagName(KEY_SUBCATEGORIA);

Затем вы должны перемещаться по каждому узлу, вытягивая имя и идентификатор, как вы делаете сейчас.

person you786    schedule 28.06.2012
comment
Термин KEY_ITEM можно заменить на KEY_CATEGORIA. Моя проблема в данный момент заключается в том, как перемещаться по тегам ‹subcategoria›! Нужно ли мне создавать еще один NodeList внутри цикла for, который у меня сейчас есть? Потому что у меня может быть много результатов с тегом ‹subcategoria› - person CainaSouza; 28.06.2012
comment
Если вы просто хотите получить каждый тег подкатегории в документе, то то, что у вас есть сейчас, прекрасно. - person you786; 29.06.2012
comment
Создание другого NodeList и получение элементов с тегом ‹subcategoria› возвращает все теги в документе, но мне нужно получить тег ‹subcategoria›, который находится внутри каждого тега ‹categoria›. - person CainaSouza; 29.06.2012
comment
Тогда вам действительно следует уточнить свой вопрос, это должно было быть указано с самого начала. - person you786; 29.06.2012

Я понял! Я использовал только ту же структуру, что и раньше!

Я добавил этот код внутри цикла for, который у меня был:

NodeList nlSubcategorias = e.getElementsByTagName("subcategoria");
        ArrayList<HashMap<String, String>> subcategorias = new ArrayList<HashMap<String, String>>();

        for (int j = 0; j < nlSubcategorias.getLength(); j++) {
            HashMap<String, String> mapSub = new HashMap<String, String>();

            Element eSub = (Element)nlSubcategorias.item(j);

            mapSub.put(KEY_ID_SUB, parser.getValue(eSub, KEY_ID_SUB));
            mapSub.put(KEY_NAME_SUB, parser.getValue(eSub, KEY_NAME_SUB));

            subcategorias.add(mapSub);

            System.out.println("subcategorias: " + subcategorias.get(j).get(KEY_NAME_SUB));
        }
        subcategoriasItems.add(subcategorias);
person CainaSouza    schedule 29.06.2012