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可以在程序中控制想解析到哪里就可以停止解析。
浙公网安备 33010602011771号