Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中使用dom解析器获取值列表_Java_Android_Xml Parsing_Domparser - Fatal编程技术网

Java 在android中使用dom解析器获取值列表

Java 在android中使用dom解析器获取值列表,java,android,xml-parsing,domparser,Java,Android,Xml Parsing,Domparser,我必须开发一个android应用程序 这里我有以下xml格式 <Product> <product name="viki" productid="111"> <ProductType> <producttype>Nokia</producttype> <producttype>Samsung</producttype> </ProductType> </product> </Prod

我必须开发一个android应用程序

这里我有以下xml格式

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

诺基亚
三星
在这里,我必须获得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);
}
if(子类别ChildNode.hasChildNodes()){
//解析“子类别”子类别
NodeList productNL=子类别ChildElmt.getElementsByTagName(“产品”);
if(productNL.getLength()>0){
ArrayList productAL=新的ArrayList();
productBean=null;
用于(int pCnt=0;pCnt 0){
ArrayList ProductTypeAL=新的ArrayList();
ProductType productTypeBean=null;

for(int ptCnt=0;ptCnt我想说代码的一个问题(可能是其他问题),就是在for循环之前声明了
productTypeBean
producttypelmt
,之后不需要它,所以不需要它

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);
}
if(子类别ChildNode.hasChildNodes()){
//解析“子类别”子类别
NodeList productNL=子类别ChildElmt.getElementsByTagName(“产品”);
if(productNL.getLength()>0){
ArrayList productAL=新的ArrayList();
productBean=null;
用于(int pCnt=0;pCnt 0){
ArrayList ProductTypeAL=新的ArrayList();

对于(int ptCnt=0;ptCnt,您只获得一个
(诺基亚)而不是完整列表的原因是,您在
节点上循环,认为您在
节点上循环

因此,您需要另一个内部循环来覆盖所有子产品类型节点,如

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

将直接为
节点提供
NodeList

在您的日志中,您是否看到
产品类型都是诺基亚的
产品类型都是三星的
?为什么不使用SAX解析器,它比将所有内容都保存在DOM解析器中更节省内存-而且Android应用程序的内存有限。@NoBugs是的,我有我试过了。但在做sax解析器时,我遇到了更多的问题。这就是我选择dom解析器的原因。谢谢你给了我这么好的解决方案。非常感谢。非常感谢。我从这些答案中学到了更多。@user2218667我很高兴能帮上忙。谢谢你的赏识。
 String xpath = "//product[@name=\"viki\"]/ProductType/producttype";