原文地址: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,虽然xml文件太大时不建议用dom方式解析,但是如果文件比较小,也不失为一种选择。项目中xml放在assets文件夹下,view绑定使用butterknife
包括android代码实例以及个人对Dom解析xml文件的总结文档。
android上使用DOM解析XML的简单示例。android4.0以上。
android dom解析XMl文件,这是一个简单的小示例,希望对大家有所帮助
android为我们提供了多种解析方式,DOM解析,代码操作简单,一直为解析xml文件的一个不错的选择
android dom方式解析xml 完整的工程,直接可运行
本文实例讲述了Android中DOM解析xml文件的方法。分享给大家供大家参考,具体如下: 一、在assets文件中写xml文件 <?xml version=1.0 encoding=UTF-8?> 李明 <age>30 李向梅 <age>25 二、在...
android 使用dom解析全世界地区城市xml文件并存入数据库
提供了android中使用dom、pull、sax三种方式进行xml解析,xml文件放置在assets文件夹下,view绑定使用butterknife
支持SAX解析XML文件,DOM解析XML文件,Pull解析器解析XML文件,Pull生成XML文件,JAVA和Kotlin两种语言编写
Android 创建与解析XML Dom4j方式
android版本更新、dom解析xml、新版本下载与安装、web端项目
用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)...
使用Android自带的工具,解析xml文件内容,并显示在程序界面上
该Demo是通过Dom方式来解析xml,运行环境为androidStudio。
pull,sax,dom,解析XML的例子:各一个
Android解析xml(2)---DOM解析
Android中解析xml的三种方式DOM SAX PULL,以及各自优缺点
简单的sax和dom解析xml实例 注意 在android上运行的.
读取和解析xml文件