按属性查找标签并阅读他所有的孩子

时间:2013-04-16 13:30:06

标签: android xml xml-parsing xmlpullparser

我有这个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="StackOverflow" />
    </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 个答案:

答案 0 :(得分: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”标签并默认开始读取每个新元素。最后,当您阅读“产品”的结束标记时,请停止所有操作。