【问题标题】:Get the list of values using dom parser in android在android中使用dom解析器获取值列表
【发布时间】:2013-06-13 01:19:39
【问题描述】:

我必须开发一个安卓应用程序。

这里我遵循以下 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 单独的。但我需要显示值 nokia、samsung...如果我必须运行应用程序意味着获取单个值。但我需要获取所有值的列表..

我的代码有什么问题..请检查并给我解决这些问题???

【问题讨论】:

  • 在您的日志中,您是否同时看到了Product Types are NokiaProduct Types are Samsung
  • 为什么不使用 SAX 解析器,它比将所有内容都保存在 DOM 解析器中的内存效率更高 - 而且 Android 应用程序的内存有限。
  • @NoBugs 是的,我已经尝试过了。但是我在做 sax 解析器时遇到了更多问题。这就是我选择 dom 解析器的原因。

标签: java android xml-parsing domparser


【解决方案1】:

你只得到一个&lt;producttype&gt;(诺基亚)而不是完整列表的原因是你在循环&lt;ProductType&gt;节点的长度,认为你在循环&lt;producttype&gt;节点。

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

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()Node.getTextContexnt() 方法,而不是首先将类型转换为Element 并使用它的方法或XMLfunctions 实用程序类。

我还建议为子节点使用不同的名称,而不是依赖使用不同的大小写来避免将来出现此类问题。避免名称冲突(当您无法想出不同的名称时)的一种简单方法是简单地使用复数形式,例如 &lt;ProductTypes&gt; 作为父标签。

但是,当您需要深入解析 DOM 树时,更好的方法是使用 XPath 直接获取您感兴趣的节点列表。我不完全确定程序做了什么,但只是给你举个例子XPathlike

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

会直接为您提供NodeList&lt;producttype&gt; 节点。

【讨论】:

  • 感谢您为我提供了如此出色的解决方案。非常感谢。非常感谢。我从这些答案中学到了更多。
  • @user2218667 很高兴为您提供帮助。感谢您的赞赏。
【解决方案2】:

我会说您的代码的问题之一(可能是其他代码)是您在 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2019-02-18
    • 2016-04-21
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多