对于解析大型的xml,可能使用整个document或整个文件都读到内存中是不合适的。
以下只是一个用例,sax解析是无状态的,也就是说他不知道上一次解析了什么,或下一次解析什么,他只知道解析的是当前行,所以这是流水线的,不会占大内存.
以下只是一个用例,sax解析是无状态的,也就是说他不知道上一次解析了什么,或下一次解析什么,他只知道解析的是当前行,所以这是流水线的,不会占大内存.
package org.frame.base.xml.jdk;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
/**
* foreigner 's xml paser is interesting.
*
* @author ycl
* @version 1.0 2012-12-10 上午10:50:53
* @since 1.0
*
*/
public class JDKxmlSax {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer xml = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
xml.append("<contact>");
xml.append("<item>");
xml.append("<uic>1</uic>");
xml.append("<fullName>ycl1</fullName>");
xml.append("</item>");
xml.append("<item>");
xml.append("<uic>2</uic>");
xml.append("<fullName>ycl2</fullName>");
xml.append("</item>");
xml.append("</contact>");
InputSource is = new InputSource(new StringReader(xml.toString()));
ContactListXmlHandler handler = parse(is);
System.out.println(handler.getContactNameList());
}
public static ContactListXmlHandler parse(InputSource input){
ContactListXmlHandler handler = new ContactListXmlHandler();
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser sp = factory.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(handler);
xr.parse(input);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return handler;
}
}
package org.frame.base.xml.jdk;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ContactListXmlHandler extends DefaultHandler implements Resources {
private List<ContactName> contactNameList = new ArrayList<ContactName>();
private ContactName contactItem;
private StringBuffer sb;
public List<ContactName> getContactNameList() {
return contactNameList;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
sb = new StringBuffer();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals(CONTACT_ITEM)) {
contactItem = new ContactName();
}
sb.setLength(0);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
try {
super.characters(ch, start, length);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sb.append(ch, start, length);
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if (contactItem != null) {
if (qName.equalsIgnoreCase(ITEM_UIC)) {
contactItem.setUid(sb.toString());
} else if (qName.equalsIgnoreCase(ITEM_FULLNAME)) {
contactItem.setFullName(sb.toString());
} else if (qName.equalsIgnoreCase(CONTACT_ITEM)) {
contactNameList.add(contactItem);
}
sb.setLength(0);
}
}
}
package org.frame.base.xml.jdk;
import net.sf.json.JSONObject;
public class ContactName {
private String uid;
private String fullName;
private String width;
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
@Override
public String toString() {
return "uid:"+uid+",fullName:"+fullName+",width:"+width;
}
}