XML文件解析
发布时间:2020-12-16 05:50:07 所属栏目:百科 来源:网络整理
导读:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整
XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。 DOM移动基本不用,所以我只把SAX,PULL做下笔记 要解析的XML文件 <?xml version="1.0" encoding="UTF-8"?> <books> <book price="99.0" 出版日期="2008年">疯狂Java讲义</book> <book price="89.0" 出版日期="2009年">轻量级Java EE企业应用实战</book> <book price="69.0" 出版日期="2009年">疯狂Ajax讲义</book> </books>
class MySaxHandler extends DefaultHandler { private Map<String,String> map = null;// 存储单个解析的完整对象 private List<Map<String,String>> list = null;// 存储所有的解析对象 private String currentTag = null;// 正在解析的元素标签 private String currentValue = null;// 解析当前元素的值 private String nodeName = "book"; @Override public void startDocument() throws SAXException { Log.d("kk","startDocument............"); } @Override public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { Log.d("kk","startElement............"+"uri:"+uri+" localName:"+localName+" qName:"+qName); if (attributes != null) {//标签的属性 for (int i = 0; i < attributes.getLength(); i++) { if (attributes.getQName(i).equals("price")) { sb.append("n价格:"); sb.append(attributes.getValue(i)); System.out.println(attributes.getValue(i)+"........................"); } if (attributes.getQName(i).equals("出版日期")) { sb.append("n出版日期:"); sb.append(attributes.getValue(i)); System.out.println(attributes.getValue(i)+".........///..............."); } } } currentTag = qName; } @Override public void endDocument() throws SAXException { super.endDocument(); Log.d("kk","endDocument............"); } @Override public void endElement(String uri,String qName) throws SAXException { sb.append("nn"); Log.d("kk","endElement............"+"uri:"+uri+" localName:"+localName+" qName:"+qName); } @Override public void characters(char[] ch,int start,int length) throws SAXException { Log.d("kk","characters............"); if(currentTag!=null&¤tTag.equals(nodeName)) { currentValue = new String(ch,start,length).trim(); sb.append("n书名:"); sb.append(currentValue); System.out.println(currentValue+"..........nn.............."); } currentTag = null; currentValue = null; } }
public void click2(View v) { sb = new StringBuilder(); SAXParserFactory factory=SAXParserFactory.newInstance();//创建解析器 try { XMLReader reader=factory.newSAXParser().getXMLReader(); reader.setContentHandler(new MySaxHandler());//为reader设置内容处理器 reader.parse(new InputSource(getResources().openRawResource(R.raw.books)));//开始解析文件 } catch (Exception e) { e.printStackTrace(); } textView.setText(sb.toString()); }
PULL方法 public void click1(View v) { // 根据XML资源的ID获取解析该资源的解析器 // XmlResourceParser是XmlPullParser的子类 XmlResourceParser parser = getResources().getXml(R.xml.books); sb = new StringBuilder(); // 还没有到文档的结尾处 try { while (parser.getEventType() != XmlResourceParser.END_DOCUMENT) { // 如果遇到开始标签 if (parser.getEventType() == XmlResourceParser.START_TAG) { String tagName = parser.getName(); // 如果遇到book标签 if (tagName.equals("book")) { String bookName = parser.getAttributeValue(null,"price"); sb.append("价格:"); sb.append(bookName); // 根据属性索引获取属性值 String bookPrice = parser.getAttributeValue(1); sb.append("n出版日期:"); sb.append(bookPrice); sb.append("n书名:"); sb.append(parser.nextText()); } sb.append("nn"); } // 获取解析器的下一个事件 parser.next(); } textView.setText(sb.toString()); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |