2013-06-17 2 views
5

में डोम पार्सर का उपयोग करके मानों की सूची प्राप्त करें मुझे एक एंड्रॉइड एप्लिकेशन विकसित करना है।एंड्रॉइड

यहां मुझे xml प्रारूप का पालन करना है।

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

यहाँ मैं product.so मैं निम्नलिखित कोड लिखा है particluar के लिए ProductType प्राप्त करने के लिए: अकेला मैं मूल्य नोकिया प्रदर्शित करने के लिए की जरूरत है

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

यहाँ हूँ मूल्य मिल रहा है नोकिया है , सैमसंग ... अगर मुझे ऐप चलाने का मतलब है तो एकल मान प्राप्त करना है। लेकिन मुझे सभी मूल्यों की सूची प्राप्त करने की आवश्यकता है ..

मेरे कोड में क्या गलत है .. कृपया जांचें और मुझे समाधान दें ?? ?

+0

अपने लॉग में, क्या आप दोनों 'उत्पाद प्रकार नोकिया' और 'उत्पाद प्रकार सैमसंग' दोनों देखते हैं? – MagicMicky

+0

SAX पार्सर का उपयोग क्यों न करें, यह डोम पार्सर में स्मृति में सबकुछ रखने से अधिक स्मृति-कुशल है - और एंड्रॉइड ऐप्स में सीमित स्मृति है। – NoBugs

+0

@NoBugs हाँ मैंने कोशिश की है। लेकिन मुझे sax पार्सर करने पर और अधिक समस्याएं आ रही हैं। यही कारण है कि मैं डोम पार्सर को चकित कर रहा हूं। – user2218667

उत्तर

6

कारण आप केवल एक <producttype> (नोकिया) हो रही है पूरी सूची के बजाय क्योंकि आप <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); 
} 

मैं सीधे अपने तरीकों या का उपयोग कर Element पहले करने के लिए, Node.getChildNodes() और Node.getTextContexnt() तरीकों का उपयोग किया है प्रकार कास्टिंग के बजाय और सभी बच्चे उत्पाद प्रकार नोड्स कवर करने के लिए एक और भीतरी पाश की जरूरत है XMLfunctions उपयोगिता वर्ग।

मैं भविष्य में ऐसी समस्याओं से बचने के लिए एक अलग मामले का उपयोग करने पर निर्भर होने के बजाय बाल नोड्स के लिए अलग-अलग नामों का उपयोग करने की भी सिफारिश करता हूं। नाम टकराव से बचने का एक आसान तरीका (जब आप किसी भिन्न नाम के साथ आने में सक्षम नहीं होते हैं) केवल मूल टैग के लिए <ProductTypes> जैसे बहुवचन का उपयोग करना है।

हालांकि, एक बेहतर दृष्टिकोण जब आपको एक डोम पेड़ के भीतर गहराई से विश्लेषण करने की आवश्यकता होती है, तो XPath का उपयोग सीधे उस नोड्स की सूची प्राप्त करने के लिए करें जो मुझे आपकी रूचि है। मुझे पूरा यकीन नहीं है कि कार्यक्रम क्या करता है लेकिन बस आपको एक उदाहरण एक XPath

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

आप NodeList<producttype> के लिए नोड्स सीधे देना होगा दे।

+0

मुझे इतना अद्भुत समाधान देने के लिए धन्यवाद। बहुत धन्यवाद। बहुत बहुत धन्यवाद। मैंने इन उत्तरों से और अधिक सीखा है। – user2218667

+0

@ user2218667 मुझे मदद करने में खुशी है। प्रशंसा के लिए धन्यवाद। –

1

मैं आपके कोड की समस्या (अन्य हो सकता है) में से एक कहूंगा, यह है कि आप अपने productTypeBean और productTypeElmt को अपने लूप से पहले घोषित करते हैं, और चूंकि इसकी आवश्यकता नहीं है, इसकी आवश्यकता नहीं है।

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