2013-06-17 9 views
5

Devo sviluppare un'applicazione Android.Ottieni l'elenco dei valori utilizzando dom parser in Android

Qui ho seguito il seguente formato xml.

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

Qui ho per ottenere il di prodotto per particluar product.so ho scritto il seguente codice:

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); 
} 

Qui sto ottenendo il valore è Nokia alone.but ho bisogno di visualizzare il valore di Nokia , samsung ... se devo eseguire l'app significa ottenere single value.but ho bisogno di ottenere l'elenco di tutti i valori ..

Cosa c'è di sbagliato nel mio codice .. si prega di controllare e darmi soluzione per questi ?? ?

+0

Nel registro, vedete sia 'Tipi di prodotti sono Nokia' che' Tipi di prodotto sono Samsung'? – MagicMicky

+0

Perché non utilizzare parser SAX, è più efficiente in termini di memoria che tenere tutto in memoria in un parser DOM - e le app Android hanno memoria limitata. – NoBugs

+0

@NoBugs sì, ho provato a that.but ho più problemi a fare il parser sax. Ecco perché ho un pars pars domico. – user2218667

risposta

6

Il motivo che stai ricevendo solo una <producttype> (Nokia) al posto della lista completa, perché si sta in loop per tutta la lunghezza del <ProductType> nodi pensare che stai loop negli <producttype> quelli.

Quindi, è necessario un altro ciclo interno per coprire tutti i nodi tipo di prodotto bambino come

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); 
} 

ho usato direttamente i Node.getChildNodes() e Node.getTextContexnt() metodi, invece di tipo casting per Element prima e utilizzando i suoi metodi o la classe di utilità XMLfunctions.

Si consiglia inoltre di utilizzare nomi diversi per i nodi figlio anziché affidarsi a un caso diverso per evitare tali problemi in futuro. Un modo semplice per evitare la collisione dei nomi (quando non si riesce a trovare un nome diverso) è semplicemente utilizzare un plurale come <ProductTypes> per il tag principale.

Tuttavia, un approccio migliore quando è necessario analizzare in profondità all'interno di un albero DOM è utilizzare uno XPath per ottenere direttamente l'elenco di nodi che ti interessa. Non sono completamente sicuro di ciò che fa il programma ma solo per fare un esempio un XPath come

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

darebbe la NodeList per <producttype> nodi direttamente.

+0

Grazie per avermi dato una soluzione così meravigliosa. Grazie mille. Grazie. Ho imparato di più da queste risposte. – user2218667

+0

@ user2218667 Sono felice di aiutare. Grazie per l'apprezzamento. –

1

Direi che uno dei problemi del codice (potrebbe essere altri), è che dichiari il tuo productTypeBean e productTypeElmt prima del ciclo for, e dal momento che non è richiesto dopo, non è necessario.

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); 
} 
Problemi correlati