0

我有这个 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();
    }
}

任何人都可以帮忙吗?

4

1 回答 1

1

我建议只在一个级别而不是嵌套循环上检查事件类型,并使用布尔标志来指示您在特定的“产品”元素中:

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为真,我们将停止寻找“产品”标签并默认开始读取每个新元素。最后,当您阅读“产品”的结束标签时,请停止一切​​。

于 2013-04-16T13:43:30.653 回答