5

Androidアプリケーションを開発する必要があります。

ここでは、次のxml形式に従います。

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

ここでは、特定の製品の製品タイプを取得する必要があるため、次のコードを作成しました。

    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 値 nokia,samsung を表示する必要があります...アプリを実行する必要がある場合は、単一の値を取得することを意味します.しかし、すべての値のリストを取得する必要があります..

私のコードの何が問題なのですか..これらを確認して解決策を教えてください???

4

2 に答える 2

6

完全なリストではなく1 つ (Nokia) しか得られない理由は、ノードをループしていると考えてノード<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);
}

最初に型キャストしてそのメソッドまたはユーティリティ クラスを使用する代わりに、 Node.getChildNodes()andメソッドを直接使用しました。Node.getTextContexnt()ElementXMLfunctions

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

ただし、DOM ツリーの奥深くで解析する必要がある場合のより良いアプローチは、 an を使用して、XPath関心のあるノードのリストを直接取得することです。プログラムが何をするのか完全にはわかりませんが、例を挙げてXPathお気に入り

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

NodeListfor<producttype>ノードを直接提供します。

于 2013-06-25T16:39:07.307 に答える