Найти тег по атрибуту и ​​прочитать все его дети

У меня есть этот XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<Products>
<Product productName="testProduct1">
    <Fields>
        <Field name="Stack" />
        <Field name="Overflow" />
    </Fields>
    <AnotherFields>
        <Field name="Test" />
    </AnotherFields>
</Product>
<Product productName="testProduct">
    <Fields>
        <Field name="Stackru" />
    </Fields>
</Product>
</Products>

И хочу прочитать все дочерние теги product который имеет исключительное значение атрибута productName, все остальные теги это хочу пропустить.

И вот мой код Java, я застрял:

public void mainParser(XmlResourceParser configXML, String productNameParameter)
        throws XmlPullParserException, IOException {
    int eventType = -1; 
    String strName, productName;

    while (eventType != XmlResourceParser.END_DOCUMENT) {
        if (eventType == XmlResourceParser.START_TAG) {

            strName = configXML.getName();

            if (strName.equals("Product")) {
                if (eventType == XmlResourceParser.START_TAG) {

                    productName = configXML.getAttributeValue(null, "productName");

                    if (productName.equals(productNameParameter)) {
                        eventType = configXML.next();

                        //here is the problem

                    }
                }
            }
        }
        eventType = configXML.next();
    }
}

Кто-нибудь может помочь?

1 ответ

Решение

Я предлагаю проверять только типы событий на одном уровне, а не вложенные циклы, и использовать логические флаги, чтобы указать, что вы находитесь внутри определенного элемента "Product":

boolean foundIt = false;
while (eventType != XmlResourceParser.END_DOCUMENT) {
    strName = configXML.getName();

    if (eventType == XmlResourceParser.START_TAG) {
        if (!foundIt && strName.equals("Product")) {
            productName = configXML.getAttributeValue(null, "productName");

            if (productName.equals(productNameParameter)) {
                foundIt = true;
            }
        }
        else if (foundIt) {
            // Children
        }
    }
    else if (eventType == XmlResourceParser.END_TAG) {
        if (foundIt && strName.equals("Product")) {
            foundIt = false;
            return; // You've found what you want, leave method
        }
    }

    eventType = configXML.next();
}

Теперь ты не будешь звонить configXML.next() или проверка eventType в нескольких местах, что может легко запутать. Обратите внимание, что однажды foundIt это правда, мы перестаем искать теги "Product" и начинаем читать каждый новый элемент по умолчанию. Наконец, когда вы прочитаете конечный тег "Product", остановите все.

Другие вопросы по тегам