2013-04-16 2 views
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(); 
    } 
} 

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

ответ

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 истинно, мы перестаем искать теги «Продукт» и начинаем читать каждый новый элемент по умолчанию. Наконец, когда вы читаете конечный тег «Product», прекратите все.