Java 在android中使用dom解析器获取值列表
我必须开发一个android应用程序 这里我有以下xml格式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
<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";