android解析xml 三种方式

XML格式

<?xml version="1.0" encoding="utf-8" ?>
<ROWDATA>

<ROW>
  <OBJECTID>72</OBJECTID>
  <NAME>紫金观</NAME>
  <LONGITUDE>116.31300336</LONGITUDE>
  <LATITUDE>39.94504101</LATITUDE>
</ROW>
<ROW>
  <OBJECTID>72</OBJECTID>
  <NAME>紫金观</NAME>
  <LONGITUDE>116.31300336</LONGITUDE>
  <LATITUDE>39.94504101</LATITUDE>
</ROW>

</ROWDATA>

 

1.DOM解析

File file = new File(Environment.getExternalStorageDirectory()
                + "/mtems/BaseMap/Layers/code_bas_district.xml");
        try {

            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document doc = builder.parse(new FileInputStream(file));
            Element element = (Element) doc.getDocumentElement();
            NodeList bookNodes = element.getElementsByTagName("ROW");
            int count = bookNodes.getLength();
            StringBuffer buffer = new StringBuffer();
            if (count > 0) {
                Database db = new Database(mContext);
                db.open();
                for (int i = 0; i < count; i++) {
                    Element info = (Element) bookNodes.item(i);
                    db.execSQL("insert into code_bas_district(districtcode,name,longitude,latitude) values ('"
                            // + info.getElementsByTagName("OBJECTID").item(0)
                            // .getFirstChild().getNodeValue()
                            + UUID.randomUUID().toString()
                            + "','"
                            + info.getElementsByTagName("NAME").item(0)
                                    .getFirstChild().getNodeValue()
                            + "','"
                            + info.getElementsByTagName("LONGITUDE").item(0)
                                    .getFirstChild().getNodeValue()
                            + "','"
                            + info.getElementsByTagName("LATITUDE").item(0)
                                    .getFirstChild().getNodeValue() + "');");
                }
                db.close();
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

2.sax解析

    private List<Object> parseDataXML(String resultXML) {
        InputStream inputStream = new ByteArrayInputStream(resultXML.getBytes());
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp;
        try {
            sp = spf.newSAXParser();

            // XMLReader xmlReader = sp.getXMLReader(); // 獲得XMLReader對象
            DataInitXMLHandler xmlHandler = new DataInitXMLHandler();
            // xmlReader.setContentHandler(xmlHandler); // 設置處理XML的Handler
            // xmlReader.parse(new InputSource(inputStream));

            sp.parse(inputStream, xmlHandler);
            return xmlHandler.getResult();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

public class DataInitXMLHandler extends DefaultHandler {

    //标签名
    private static final String MODEL = "model";
    private static final String PARAM = "param";
    private static final String TYPE = "type";
    private static final String TABLE = "table";
    private static final String ROW = "row";
    private static final String COL = "col";
    private static final String NAME = "name";
    private static final String MOBILE = "mobile";
    
    //
    private String currentParam;
    //当前标签中的文本
    private StringBuffer buffer = new StringBuffer();
    
    //表名
    private String tablename;
    //列名
    private List<String> colnamesList;
    //列值
    private List<String> colattrsList;
    
    //返回值
    private Map<String, String> resultMap;
    //插入数据语句
    private List<String> insertList = new ArrayList<String>();
    //临时数据
    private List<Object> tempList = new ArrayList<Object>();
    
    //返回结果
    private List<Object> returnList;
    public List<Object> getResult(){
        return returnList;
    }
    
    /**
     * 要开始读取xml文件的时候调用的方法 
     */
    @Override
    public void startDocument() throws SAXException {
        
    }

    /**
     * sax 读取到文本节点的时候调用了这个方法
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        buffer.append(ch, start, length);  
        super.characters(ch, start, length);
        
    }

    /**
     * sax 读取到元素节点开始标签的时候用到这个方法;
     */
    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        
        if(localName.equals(COL)){
            colnamesList.add(attributes.getValue(NAME));
            buffer.setLength(0);
            
        }else if(localName.equals(ROW)){
            colnamesList = new ArrayList<String>();
            colattrsList = new ArrayList<String>();
            
        }else if(localName.equals(TABLE)){
            tablename = attributes.getValue(NAME);
            
        }else if(localName.equals(MODEL)){
            resultMap.put("model", attributes.getValue(NAME));
            resultMap.put("type", attributes.getValue(TYPE));
            
        }else if(localName.equals(PARAM)){
            currentParam = attributes.getValue(NAME);
            buffer.setLength(0);
            
        }else if(localName.equals(MOBILE)){
            returnList = new ArrayList<Object>();
            resultMap = new HashMap<String, String>();
            resultMap.put("personid", attributes.getValue("personid"));
        }
        
    }

    /**
     * 这个方法是每次遇到结束的标签都会执行的 并不是只遇到最后的结尾才调用
     * 
     */
    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        if(localName.equals(ROW)){
            if(tablename.equals(IConstants.GPS_TABLE_NAME)){
                Gpspda gpspda = new Gpspda();
                gpspda.setDeviceid(colattrsList.get(0));
                gpspda.setPdagpsid(colattrsList.get(1));
                gpspda.setLongitude(Double.parseDouble(colattrsList.get(2)));
                gpspda.setLatitude(Double.parseDouble(colattrsList.get(3)));
                tempList.add(gpspda);
                
            } else if (tablename.equals("search")){
                tempList.add(colattrsList.get(0));
                
            }else{
                String insertSql = "";
                insertSql = "insert into "+tablename+"(";
                
                for(int i=0; i<colnamesList.size(); i++){
                    if(i != colnamesList.size()-1){
                        insertSql += " "+colnamesList.get(i)+", ";
                    }else{
                        insertSql += " "+colnamesList.get(i)+" ";
                    }
                }
                insertSql += ")";
                insertSql += " values(";
                for(int i=0; i<colattrsList.size(); i++){
                    String value = colattrsList.get(i);
                    if(value.trim().length() <= 0){
                        value = "";
                    }
                    if(i != colattrsList.size()-1){
                        insertSql += " '"+value+"', ";
                    }else{
                        insertSql += " '"+value+"' ";
                    }
                }
                insertSql += ");";
                
                insertList.add(insertSql);
            }
            
        }else if(localName.equals(MOBILE)){
            returnList.add(resultMap);
            returnList.add(insertList);
            returnList.add(tempList);
            
        }else if(localName.equals(COL)){
            colattrsList.add(buffer.toString());
            buffer.setLength(0);
            
        }else if(localName.equals("param")){
            resultMap.put(currentParam, buffer.toString());
            buffer.setLength(0);
        }
        
    }
    
    /**
     * 读取xml文件结束的时候调用的方法 
     */
    @Override
    public void endDocument() throws SAXException {
        
    }
}

3.pull 解析

<?xml version="1.0" encoding="UTF-8"?>  
<books>  
    <book id="12">  
        <name>thinking in java</name>  
        <price>85.5</price>  
    </book>  
    <book id="15">  
        <name>Spring in Action</name>  
        <price>39.0</price>  
    </book>  
</books>  
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

import com.xtlh.cn.entity.Book;

public class PullParseService {
    public static List<Book> getBooks(InputStream inputStream) throws Exception{
        List<Book> books = null;
        Book book = null;
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inputStream, "UTF-8");
        
        int event = parser.getEventType();//产生第一个事件
        while(event!=XmlPullParser.END_DOCUMENT){
            switch(event){
            case XmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件
                books = new ArrayList<Book>();//初始化books集合
                break;
            case XmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件
                if("book".equals(parser.getName())){//判断开始标签元素是否是book
                    book = new Book();
                    book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id
                }
                if(book!=null){
                    if("name".equals(parser.getName())){//判断开始标签元素是否是name
                        book.setName(parser.nextText());
                    }else if("price".equals(parser.getName())){//判断开始标签元素是否是price
                        book.setPrice(Float.parseFloat(parser.nextText()));
                    }
                }
                break;
            case XmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件
                if("book".equals(parser.getName())){//判断结束标签元素是否是book
                    books.add(book);//将book添加到books集合
                    book = null;
                }
                break;
            }
            event = parser.next();//进入下一个元素并触发相应事件
        }//end while
        return books;
    }
}

三种解析方式个有优缺点;

1.dom解析需要将全部加载到内存,速度比pull慢。

2.pull sax都是事件驱动,不用一次性加载。

Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。

posted on 2013-03-04 10:36  _star  阅读(459)  评论(0)    收藏  举报

导航