1.SAX解析原理::
SAX式一个接卸速度快并且占用内存少的XML解析器,SAX解析XML文件采用的是事件驱动,也就是说不需要解析完整个文件,在按内容顺序解析文件过程中,SAX会判断当前独到的字符是否符合XML语法中的某个部分,如果符合就会触发事件。。就是在读取文件过程中读完一个元素节点(每个元素的节点)或者是文本节点(就是元素中间的内容,包括上一个节点结束到下一个节点开始,那一段空白页是文本节点)后,触发一个事件。
<?xml version = "1.0" encoding="UTF-8"?>--------startDocument()开始头部
<person> --------------->startElement()开始元素语法
(这里文本节点,characters()方法) <name>jj</name>
<age>30</age>
</person>----------------->endElement()结束元素语法 文件结束后触发endDocument()
public List<Person> getPersons(InputStream inStream) throws Throwable{
SAXParserFactory factory = SAXParserFactory.newInstance(); // SAX工厂得到实例
SAXParser parser = factory.newSAXParser();//得到解析器
parser.parse(inStream, handler);//第二参数中,是DefaleHandler 是帮助类,实现了contentHandler接口,继承此类实现其中SAX事件方法。
}
2.DOM解析:
/**
* 采用DOM解析XML内容
*/
public class DOMPersonService {
public static List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = new ArrayList<Person>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document documnet = builder.parse(inStream);
Element root = documnet.getDocumentElement();
NodeList personNodes = root.getElementsByTagName("person");
for(int i=0 ; i < personNodes.getLength(); i++){
Person person = new Person();
Element personElement = (Element)personNodes.item(i);
person.setId(new Integer(personElement.getAttribute("id")));
NodeList personChilds = personElement.getChildNodes();
for(int y=0 ; y < personChilds.getLength(); y++){
if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点
Element childElement = (Element)personChilds.item(y);
if("name".equals(childElement.getNodeName())){
person.setName(childElement.getFirstChild().getNodeValue());
}else if("age".equals(childElement.getNodeName())){
person.setAge(new Short(childElement.getFirstChild().getNodeValue()));
}
}
}
persons.add(person);
}
return persons;
}
}
3.pull解析:
public static List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();//产生第一个事件
while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
String name = parser.getName();//获取解析器当前指向的元素的名称
if("person".equals(name)){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}
if(person!=null){
if("name".equals(name)){
person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
}
if("age".equals(name)){
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
return persons;
}
}
二。xml文件生成方式
1.使用StringBuilder拼接:注意有特殊字符的时候要转义
StringBuilder buidler = new StringBuilder();
buidler.append(<person>);
......
FileOutPutStream stream=new FileOutPutStream (file);
......
2.采用pull生成xml
public static void save(List<Person> persons, Writer writer) throws Throwable{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
for(Person person : persons){
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
writer.flush();
writer.close();
}