`
landyer
  • 浏览: 141917 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android DOM 解析 xml

 
阅读更多

原文地址:http://blog.163.com/joe_zhpf@126/blog/static/81331086201041271841759/

 

 

解析xml后返回一个 hashmap.  
形成 key - value
                  value-( ArrayList )->
                                               ListItem(HashMap(key, value))
如果value是个list.则每个list item.又是一个键值对.  如果每个item的value含有多个值,则用
自定义类的 SingleItem来保存.   每个SingleItem 包含一个 hashMap.
如果每个 item value是多个child.则list里面放置着多个Singltem.
可以无限循环.

 

 

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class Utills {
    private static final String TAG = Utills.class.getSimpleName();
    public static final boolean DEBUG_FLAG = true;
    public static final String ILLIGAL_FLAG = "#text";
    
    /**
     * only set for a node. the node hasn't any child node.
     * @param node
     * @return
     */
    public static SingleItem parseNodeAttributes(Node node){
            NamedNodeMap nameMap = node.getAttributes();
            int mapLength = nameMap.getLength();
            SingleItem  singleItem = new SingleItem();
            
            // match for <key><key> 
            if(mapLength == 0){
                singleItem.addAttribute(node.getNodeName(), "");
                return singleItem;
            }
            //fill the node attribute to a item of the list
            for(int nameIndex = 0; nameIndex < mapLength;nameIndex++){
                Node temp = nameMap.item(nameIndex);
                singleItem.addAttribute(temp.getNodeName(),temp.getNodeValue());
            }
        return singleItem;
    }
    
    /**
     * 
     * @param node
     * @param container
     * @param singleItems
     */
    public static void parseNode(Node node,HashMap<String,Object> container,ArrayList<SingleItem> singleItems){
        if(node.hasChildNodes()){
            NodeList nodeList = node.getChildNodes();
            int childLength = nodeList.getLength();
            //this code for parse <key>value</key>
            if(childLength ==1){
                if(singleItems == null){
                    // if this is the top elements, put it to the map.
                    container.put(node.getNodeName(), nodeList.item(0).getNodeValue());
                }else{
                    // if it not the top element, save it as the SingItem
                    SingleItem  singleItem = new SingleItem();
                    singleItem.addAttribute(node.getNodeName(), nodeList.item(0).getNodeValue());
                    singleItems.add(singleItem);
                }
                return;
            }
            Node nodeTemp;
            ArrayList<SingleItem> singleItesList;
             singleItesList = new ArrayList<SingleItem>();
            
            //add Item to a list.
            for(int i =0; i < childLength; i++){
                nodeTemp = nodeList.item(i);
                if(nodeTemp.getNodeType() == Node.TEXT_NODE  ){
                    continue;
                }
                parseNode(nodeList.item(i), null,singleItesList);
            }
            
            if(container == null){
                singleItems.add(new SingleItem(node.getNodeName(),singleItesList));
            }else{
                container.put(node.getNodeName(), singleItesList);
            }
            
            nodeTemp = null;
        }else{
            //  parse <key> <key2 name=10/></key>
            if(singleItems == null){
                container.put(node.getNodeName(), parseNodeAttributes(node));
            }else{
                singleItems.add(parseNodeAttributes(node));
            }
        }
    }

    /**
     * 
     * @param inputStream
     * @return
     */
    public static  HashMap<String,Object> parseXML(InputStream inputStream ) {
        HashMap<String,Object> items = new HashMap<String,Object>();
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        //TODO:  需要格式验证不?
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        Document dom = null;
        try {
             dom = builder.parse(inputStream);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
          Element root = dom.getDocumentElement();
          parseNode(root, items, null);
        return items;
    }
}

 

 

import java.util.HashMap;
import java.util.Set;

public class SingleItem {
    private HashMap<String,Object> content = new HashMap<String,Object>();
    
    /**
     * 
     */
    public SingleItem() {
    }
    
    /**
     * constructer
     * @param key
     * @param value
     */
    public SingleItem(String key, Object value) {
        this.addAttribute(key, value);
    }
    
    /**
     * Add an attribute to the item.If item has this key,return false;
     * @param key
     * @param value
     * @return
     */
    public boolean addAttribute(String key, Object value){
        if(content.containsKey(key)){
            return false;
        }
        
        content.put(key, value);
        return true;
    }
    
    /**
     * Update an attribute .If item contains this key,update the value 
     * return true,if not return false.
     * @param key
     * @param value
     * @return
     */
    public boolean updateAttribute(String key, Object value){
        if(content.containsKey(key)){
            content.put(key, value);
            return true;
        }
        return false;
    }

    @Override
    public String toString() {
        Set<String> sets = content.keySet();
        StringBuilder builder = new StringBuilder("{");
        for(Object key: sets){
            builder.append("["+key+" = "+content.get(key)+"]");
        }
        return builder.toString()+"}";
    }
}
 

 

 

分享到:
评论

相关推荐

    Android Dom解析XML

    总结来说,Android中使用DOM解析XML是一种常见且直观的方式,适合处理小规模的数据。结合ButterKnife库,可以方便地将解析结果与UI组件进行绑定,提高代码的可读性和维护性。但请注意,对于大文件,考虑使用SAX或者...

    android Dom解析xml文件

    本篇文章将深入探讨Android中的DOM解析XML文件,包括其基本原理、实现步骤和一些实用技巧。 ### 1. DOM解析的基本概念 DOM解析是一种将XML文件转换为内存中对象模型的方法。它将XML文档视为一棵树,其中每个元素、...

    android上使用DOM解析XML

    下面将详细介绍在Android中使用DOM解析XML的基本步骤和关键知识点。 1. **导入XML解析库** 在Android项目中,我们不需要额外导入库,因为DOM解析器是Java标准库的一部分,已经包含在Android SDK中。这意味着你可以...

    DOM解析xml文件实例讲解

    本篇文章将深入探讨DOM解析XML文件在Android中的应用实例。 首先,DOM解析的基本思想是将整个XML文件加载到内存中,形成一个树形结构,即DOM树。这样做的优点是解析后的数据可以方便地进行任意位置的查找和修改,但...

    android下解析xml文件的demo

    本教程将详细介绍如何在Android环境下解析XML文件,以"ReadXMLDemo"为例,展示具体步骤和关键知识点。 首先,XML(eXtensible Markup Language)是一种自定义标记语言,它的结构清晰,易于读写,适合于数据交换和...

    Android XML解析(DOM、PULL、SAX三种方式)

    在提供的`DomXmlOperate`示例中,可能包含了如何使用DOM解析XML并绑定到View(如使用ButterKnife库)的代码。 2. PULL解析: PULL解析器是事件驱动的,它以拉取(pull)的方式逐个处理XML元素,不需要一次性加载...

    经典的DOM解析XML范例

    【DOM解析XML】 在Java中,解析XML文档有多种方式,其中DOM(Document Object Model)和SAX(Simple API for XML)是最常见的两种。DOM是一种基于树形结构的XML处理方式,它将整个XML文档加载到内存中,形成一个完整...

    java使用dom解析xml

    在 Java 中,DOM 解析允许开发者将整个 XML 文件加载到内存中,形成一个树形结构,然后通过这个结构来访问和操作 XML 的各个部分。 首先,我们需要引入 Java 的核心解析库,即 javax.xml.parsers 命名空间。这个库...

    Android应用源码之28.使用DOM和pull解析XML.zip

    使用DOM解析XML的基本步骤如下: 1. 加载XML文件:使用`DocumentBuilderFactory`创建`DocumentBuilder`,然后调用`parse()`方法加载XML。 2. 构建DOM树:`DocumentBuilder`会将XML转换为`Document`对象。 3. 遍历DOM...

    Dom方式解析XML

    综上所述,DOM解析XML是Android开发中处理XML数据的一种常见方法,尤其适用于小规模数据。通过理解DOM解析的基本步骤和注意事项,开发者可以有效地读取、解析并利用XML文件中的信息。在实际项目中,根据具体需求和...

    android dom方式解析xml

    本文将深入探讨在Android中如何使用DOM方式解析XML。 首先,我们需要理解DOM解析的基本原理。DOM解析器会将整个XML文件加载到内存中,形成一个节点树。这棵树的根节点代表整个XML文档,而其他节点则表示文档中的...

    Android开发之DOM解析xml文件的方法

    本文实例讲述了Android中DOM解析xml文件的方法。分享给大家供大家参考,具体如下: 一、在assets文件中写xml文件 &lt;?xml version=1.0 encoding=UTF-8?&gt; 李明 &lt;age&gt;30 李向梅 &lt;age&gt;25 二、在...

    Android使用DOM方式解析XML

    在Android项目中,我们需要导入以下库以使用DOM解析XML: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c....

    android dom解析全世界地区城市xml并存入数据库

    android 使用dom解析全世界地区城市xml文件并存入数据库

    android版本更新与dom解析xml

    本节将深入探讨Android版本更新的过程以及DOM解析XML的技术。 一、Android版本更新 1. 版本跟进:Android系统经历了从早期的API Level 1到目前的API Level 30等多个版本。每个新版本通常包含对性能、安全性和用户...

    android 解析XML文件 生成XML文件

    二、DOM解析XML文件 DOM(Document Object Model)将整个XML文档加载到内存中,形成一棵树形结构,方便遍历和操作。对于小规模的XML文件,DOM解析器是一个不错的选择。Java和Kotlin的DOM解析步骤如下: 1. 加载XML...

    DOM读取XML文件

    DOM解析XML文件的基本步骤如下: 1. 引入必要的库:在Android项目中,我们需要引入`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers.DocumentBuilder`库,这些库提供了解析XML的工具。 2. 创建...

    Android sax pull dom 文件解析 示例

    DOM解析器将整个XML文件加载到内存中,构建一个树形结构,可以方便地通过节点操作访问XML数据。优点是操作灵活,适合小到中等大小的XML文档;缺点是如果XML文件过大,可能导致内存消耗过高。 3. **Pull解析器** ...

    Android解析xml(2)---DOM解析

    以下是关于Android中DOM解析XML的详细知识讲解。 1. **DOM解析器简介** DOM解析器是XML解析的一种方法,它将整个XML文档加载到内存中的一个对象模型,这个模型称为DOM树。开发者可以遍历这个树来访问或修改XML文件...

    PULL、DOM解析XML

    二、DOM解析XML DOM(Document Object Model)是另一种常见的XML解析方式,它将整个XML文档加载到一个树形结构中,称为DOM树。每个XML元素、属性、文本节点都在树中对应一个节点。通过DOM解析,可以方便地访问和...

Global site tag (gtag.js) - Google Analytics