【问题标题】:Find tag by attribute and read all his children按属性查找标签并读取他所有的孩子
【发布时间】:2013-04-16 13:30:06
【问题描述】:

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

谁能帮忙?

【问题讨论】:

    标签: android xml xml-parsing xmlpullparser


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2013-11-14
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多