java解析xml常用的三种方法
package com.xcz.util; import java.text.ParseException; import java.text.SimpleDateFormat; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.xcz.po.HeadPic; import com.xcz.po.User; /** * 定义xml解析时的监听类 * * 实现方式有很多,可以实现接口:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler * 但我们常用的继承:DefaultHandler */ public class SaxUtil extends DefaultHandler { private User user; private HeadPic headPic; private String content; private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); @Override public void characters(char[] ch, int start, int length) throws SAXException { content = new String(ch, start, length); } //当解析到文本开始时触发 @Override public void startDocument() throws SAXException { super.startDocument(); } //当解析到文本结束时触发 @Override public void endDocument() throws SAXException { super.endDocument(); } //当解析到元素开始时触发 @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if("user".equals(name)) { user = new User(); } if("headpic".equals(name)) { headPic = new HeadPic(); } } //当解析到元素结束时触发 @Override public void endElement(String uri, String localName, String name) throws SAXException { if("username".equals(name)) { user.setUsername(content); } if("password".equals(name)) { user.setPassword(content); } if("sex".equals(name)) { user.setSex(content); } if("birthday".equals(name)) { try { user.setBirthday(sdf.parse(content)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if("pictitle".equals(name)) { headPic.setPicTitle(content); } if("picurl".equals(name)) { headPic.setPicUrl(content); user.setHeadPic(headPic); } } public User getUser(){ return user; } }? [优点]
??? (1).节约内存开销???
??? SAX解析器在某些方面优于DOM风格解析器,因为SAX解析器的内存使用量一般远低于DOM解析器使用量。DOM解析器在任何处理开始之前,必须将xml以整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料。
??? (2)解析速度快
??? 因为SAX事件驱动的本质,处理文件通常会比DOM风格的解析器快。?
[缺点]??? SAX事件驱动的模型对于XML解析很有用,但它确实有某些缺点。
??? 某些种类的XML验证需要存取整份文件。例如,一个DTD IDREF属性需要文件内有项目使用指定字串当成DTD ID属性。要在SAX解析器内验证,必须追踪每个之前遇过的ID和IDREF属性,检查是否有任何相符。更甚者,一个IDREF找不到对应的ID,使用者只会在整份文件都解析完后才发现,若这种连结对于建立有效输出是重要的,那用在处理整份文件的时间只是浪费。
??? 另外,某些XML处理仅要求存取整份文件。举例来说,XSLT及XPath需要能够任何时间存取任何解析过的XML树。当SAX以用来建构此树时,DOM解析器在设计上已经是如此了。