2013-06-17 5 views
5

私はアンドロイドアプリケーションを開発する必要があります。アンドロイドのDOMパーサーを使って値のリストを取得

ここで私は以下のXMLフォーマットに従っています。

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

ここで私は次のコードを書いているproduct.so particluarためでProductType取得する必要があります:私は値ノキアを表示する必要がalone.butここ

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

が値を取得していますが、ノキアあります、サムスン...私は私がすべての値のリストを取得する必要がある単一のvalue.but私は、アプリケーションを実行する必要があります..

私のコードで何が問題なのですか? ?

+0

ログには、「製品タイプはNokia」と「製品タイプはSamsung」の両方が表示されますか? – MagicMicky

+0

なぜSAXパーサーを使用しないと、すべてのものをDOMパーサのメモリに保存するよりもメモリ効率が向上します。また、Androidアプリのメモリは限られています。 – NoBugs

+0

@ NoBugsはい、私はthat.Butしようとしているsaxパーサーを行う上でより多くの問題に直面している。その理由は、私はドンパーサーをchossingしている。 – user2218667

答えて

6

あなたが<producttype>ものをループしている思考<ProductType>ノードの長さをループしているので、あなたの代わりに完全なリストから1つだけ<producttype>(ノキア)を取得している理由。

だから、あなたはElement第一および使用して、その方法に代わり型鋳物、私は直接Node.getChildNodes()Node.getTextContexnt()メソッドを使用しました

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

などのすべての子製品のタイプのノードをカバーするために、別の内部ループを必要としますか、 XMLfunctionsユーティリティクラス。

将来的にこのような問題を回避するために、別のケースを使用する代わりに、異なる名前を子ノードに使用することもお勧めします。名前の衝突を避ける簡単な方法(別の名前を思いつくことができない場合)は、親タグに<ProductTypes>のような複数形を単に使うだけです。

DOMツリー内で深く解析する必要がある場合は、XPathを使用して、関心のあるノードのリストを直接取得することをお勧めします。プログラムが何をするのかがわかりませんあなた

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

よう XPathが直接 <producttype>ノードに対してあなた NodeListを与える例を与えます。

+0

このような素晴らしい解決策をくれてありがとう。たくさんありがとう。ありがとう。私はこれらの答えから多くを学んだ。 – user2218667

+0

@ user2218667私は助けてうれしいです。感謝のためにありがとう。 –

1

あなたのコードの問題の1つ(他人かもしれません)は、あなたのforループの前にproductTypeBeanproductTypeElmtを宣言していて、それは後で必要ではないので、必要ではないということです。

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); 
} 
関連する問題