2013-06-17 1 views
5

Мне нужно разработать приложение для Android.Получить список значений с помощью парсера dom в android

Здесь я следую за XML-форматом.

<Product> 
<product name="viki" productid="111"> 
<ProductType> 
<producttype>Nokia</producttype> 
<producttype>Samsung</producttype> 
</ProductType> 
</product> 
</Product> 

Здесь я должен получить ProductType для particluar product.so я написал следующий код:

if(subCategoryChildNode.hasChildNodes()){ 
      // parse 'Subcategory' childs 
     NodeList productNL = subCategoryChildElmt.getElementsByTagName("product"); 
     if(productNL.getLength() > 0){ 

     ArrayList<Product> productAL = new ArrayList<Product>(); 
     Product productBean = null; 
     for(int pCnt=0;pCnt<productNL.getLength();pCnt++){ 
      Node productNode = productNL.item(pCnt); 

      Element productElmt = null; 
      // parse 'product' tag attributes 
      if(productNode.hasAttributes()){ 
       productBean = new Product(); 
       productElmt = (Element)productNode; 
       productBean.setmProductName(productElmt.getAttribute("name")); 
      } 
      if(productNode.hasChildNodes()){ 
       NodeList productTypeNL = productElmt.getElementsByTagName("ProductType"); 
       if(productTypeNL.getLength() > 0){ 
        ArrayList<ProductType> ProductTypeAL = new ArrayList<ProductType>(); 
        ProductType productTypeBean = null; 
        for(int ptCnt=0;ptCnt<productTypeNL.getLength();ptCnt++){ 
        Node productTypeNode = productTypeNL.item(ptCnt); 
        Element productTypeElmt = null; 
        if(productTypeNode.hasChildNodes()){ 
         productTypeBean = new ProductType(); 
         productTypeElmt = (Element)productTypeNode; 
         productTypeBean.setmProductType(XMLfunctions.getValue(productTypeElmt,"producttype")); 
         System.out.println("Product Types are "+ " "+XMLfunctions.getValue(productTypeElmt,"producttype")); 
         ProductTypeAL.add(productTypeBean); 
        } 
        productBean.setmProductTypes(ProductTypeAL); 
        } 
       productAL.add(productBean); 
       } 
      } 
      subCategoryBean.setmProducts(productAL); 
     } 
     } 
    subCategoryAL.add(subCategoryBean); 
} 

Здесь я получаю значение является Nokia alone.but мне нужно, чтобы отобразить значение нокиа , samsung ... если мне нужно запустить приложение, получив одно значение. Но мне нужно получить список всех значений.

Что не так в моем коде .. пожалуйста, проверьте и дайте мне решение fot these ?? ?

+0

В вашем журнале вы видите, что оба типа продукта - это «Nokia» и «Типы продуктов - это Samsung»? – MagicMicky

+0

Почему бы не использовать синтаксический анализатор SAX, он более эффективен с точки зрения памяти, чем хранение всего в памяти анализатора DOM, а приложения для Android имеют ограниченную память. – NoBugs

+0

@NoBugs да, я попытался это сделать. Но у меня больше проблем с выполнением sax parser.that, почему у меня есть chossing dom parser. – user2218667

ответ

6

Причина вы получаете только один <producttype> (Nokia) вместо полного списка, потому что вы зацикливание по длине <ProductType> узлов мышления вы зацикливание над <producttype> из них.

Итак, вам нужен еще один внутренний цикл, чтобы охватить все узлы типа ребенка продукт, как

for(int ptCnt=0; ptCnt < productTypeNL.getLength(); ptCnt++) { 
    Node productTypeNode = productTypeNL.item(ptCnt); 
    if(productTypeNode.hasChildNodes()){ 
     NodeList childProductTypeNL = productTypeNode.getChildNodes(); 
     System.out.print("Product Types are: "); 
     for (int cptCnt=0; cptCnt < childProductTypeNL.getLength(); cptCnt++) { 
      productTypeBean = new ProductType(); 
      productTypeBean.setmProductType (
          childProductTypeNL.item(cptCnt).getTextContent()); 
      System.out.print(productTypeBean.getmProductType() + ", "); 
      ProductTypeAL.add(productTypeBean); 
     } 
    } 
    productBean.setmProductTypes(ProductTypeAL); 
} 

Я непосредственно использовал Node.getChildNodes() и Node.getTextContexnt() методы, вместо приведения типа к Element первым и с помощью методов или класс утилиты XMLfunctions.

Я также рекомендую использовать разные имена для дочерних узлов вместо того, чтобы полагаться на использование другого случая, чтобы избежать таких проблем в будущем. Простой способ избежать столкновения имен (когда вы не можете придумать другое имя) - просто использовать множественное число, например <ProductTypes> для родительского тега.

Однако лучший подход, когда вам нужно проанализировать глубоко внутри дерева DOM, является использование XPath, чтобы получить список нужных вам узлов. Я не совсем уверен, что делает программа, дать вам пример XPath как

String xpath = "//product[@name=\"viki\"]/ProductType/producttype"; 

даст вам NodeList для <producttype> узлов непосредственно.

+0

Спасибо, что дали мне такое замечательное решение. Спасибо большое. Большое вам спасибо. Я узнал больше из этого ответа. – user2218667

+0

@ user2218667 Я рад помочь. Спасибо за оценку. –

1

Я бы сказал, что одна из проблем вашего кода (может быть, другие) заключается в том, что вы объявляете свои productTypeBean и productTypeElmt перед своим циклом for, и поскольку это не требуется после, оно не требуется.

if(subCategoryChildNode.hasChildNodes()){ 
     // parse 'Subcategory' childs 
    NodeList productNL = subCategoryChildElmt.getElementsByTagName("product"); 
    if(productNL.getLength() > 0){ 
     ArrayList<Product> productAL = new ArrayList<Product>(); 
     Product productBean = null; 
     for(int pCnt=0;pCnt<productNL.getLength();pCnt++){ 
      Node productNode = productNL.item(pCnt); 

      Element productElmt = null; 
      // parse 'product' tag attributes 
      if(productNode.hasAttributes()){ 
       productBean = new Product(); 
       productElmt = (Element)productNode; 
       productBean.setmProductName(productElmt.getAttribute("name")); 
      } 
      if(productNode.hasChildNodes()){ 
       NodeList productTypeNL = productElmt.getElementsByTagName("ProductType"); 
       if(productTypeNL.getLength() > 0){ 
        ArrayList<ProductType> ProductTypeAL = new ArrayList<ProductType>(); 
        for(int ptCnt=0;ptCnt<productTypeNL.getLength();ptCnt++){ 
         Node productTypeNode = productTypeNL.item(ptCnt); 
         if(productTypeNode.hasChildNodes()){ 
          ProductType productTypeBean = new ProductType(); 
          Element productTypeElmt = (Element)productTypeNode; 
          productTypeBean.setmProductType(XMLfunctions.getValue(productTypeElmt,"producttype")); 
          System.out.println("Product Types are "+ " "+XMLfunctions.getValue(productTypeElmt,"producttype")); 
          ProductTypeAL.add(productTypeBean); 
         } 
         productBean.setmProductTypes(ProductTypeAL); 
        } 
        productAL.add(productBean); 
       } 
      } 
      subCategoryBean.setmProducts(productAL); 
     } 
    } 
    subCategoryAL.add(subCategoryBean); 
}