Android中解析xml文件的方法
1、SAX:Simple API for XML
2、DOM:Document Object Model
3、pull
SAX解析XML文件
SAX是一个解析速度快并且占用内存少的XML解析器。SAX解析XML文件采用的是事件驱动,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到字符是否符合XML语法中的某部分,如果符合触发事件(回调函数,定义在ContentHandler接口中)。
ContentHandler接口常用方法
startDocument()
当遇到文档的开头时候,调用这个方法,可以在该方法中进行预处理工作。
endDocument()
当文档结束的时候,调用这个方法,可以在该方法中进行善后工作。
startElement()
当读到一个开始标签的时候,会触发该方法。
endElement()
当遇到结束标签的时候,会调用该方法。
characters()
该方法用来处理在XML文件中读到的内容。
使用SAX读取XML文件时许创建一个类实现ContentHandler接口,此外我们可以编写一个类继承
DefaultHandler类,然后重写里面的方法:
SAXParserFactory spf = SAXParseFactory newInstance();
SAXParser saxParser = spf.newSAXParser();
XMLContentHandler handler = new XMLContentHandler();
saxParser.parse(inStream,handler);
public class XMLContentHandler{
private List<Person> persons;
private Person person;
private String preTag;
public List<Person> getPersons(){
return persons;
}
@Override
public void startDocument() throws SAXException{
persons = new ArrayList<Person>();
}
/**
*uri:命名空间
*localName:不带命名空间前缀的标签名
*qName:带命名空间前缀的标签名
*attributes:属性集合
*/
@Override
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException{
if("person".equals(localName)){
person = new Person();
person.setId(new Integer(attributes.getValue("id")));
}
preTag = localName;
}
/**
*ch[]:内容
*start:起始位置
*length:长度
*/
@Override
public void characters(char[] ch,int start,int length) throws SAXException{
if(person!=null){
String data = new String(ch,start,length);
if("name".equals(preTag)){
person.setName(data);
}else if("age".equals(preTag)){
person.setAge(new Short(data));
}
}
}
@Override
public void endElement(String uri,String localName,String qName) throws SAXException{
if("person".equals(LocalName)&&person!=null){
persons.add(person);
person = null;
}
preTag = null;
}
@Override
public void endDocument() throws SAXException{
}
}
<?xml version="1.0" encoding="UTF-8"?>
<persions xmlns:pre="http://www.baidu.com">
<pre:person id="001">
<name>coolszy</name>
<age>22</age>
</pre:persion>
<pre:person id="002">
<name>kuka</name>
<age>22</age>
</pre:persion>
</persions>
DOM解析XML文件
Dom解析是将xml文件全部载入,组装成一棵dom树,然后通过节点以及节点之间的关系来解析xml文件。对于特别大的文档,解析和加载整个文档可能很慢并且耗费资源。
public class DOMPersonService{
public static List<Person> readXml(InputStream in) throw IOExecption{
public static List<Person> persons = new ArrayList<Person>();
//实例化一个文档构造器工厂
DocumentBuilderFactory factory = DocumentBuliderFactory.newInstacnce();
//通过文档构建器工厂获取一个文档构建器
DocumentBuilder builder = factory.newDocumentBuilder();
//通过文档构建器创建一个文档实例
Document document = builder.parse(in);
Element root = document.getDocumentElement();
NodeList nodes = root.getElementsByTagName("pre:person");
for(int i=0;i<nodes.getLength();i++){
Element personElement =(Element)nodes.item(i);
Person person = new Person();
person.setId(Integer.valueOf(personElement.getAttribute("id")));
NodeList childNodes = personElement.getChildNodes();
//注意 子节点不为2,空格也算入
for(int j=0;j<childNodes.getLength();j++){
Node childNode =(Node) childNodes.item(j);
if(childNode.getNodeType() == Node.ELEMENT_NODE){
Element childElement = (Element)childNode;
if("name".equals(childElement.getNodeName())){
person.setName(childElement.getFirstChild().getNodeValue());
}else{
person.setAge(new Short(childElement.getFirstChild().getNodeValue()));
}
}
}
persons.add(person);
}
return persons;
}
}
Pull解析XML文件
Pull解析和SAX解析类似,都是轻量级的解析,Android内核中已经嵌入pull,不需要添加第三方jar来支持
(1)pull读取xml文件后触发相应的事件调用方法返回的是数字。
(2)pull可以在程序中控制想解析到哪里就可以停止解析。
public class DOMPersonService{
public static List<Person> readXml(InputStream in) throw IOExecption{
public static List<Person> persons = null;
XmlPullParser parser =Xml.newPullParser();
parser.setInput(in,"UTF-8");
int eventCode = parser.getEventType();
Person person =null;
while(eventCode !=XmlPullParser.END_DOCUMENT){//判断文档是否结束
switch(eventCode){
case XMLPullParser.START_DOCUMENT: //0文档开始事件
persons = new ArrayList<Person>();
break;
case XMLPullParser.START_TAGL: //2开始元素
if("person".equals(parser.getName())){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}
else if(null != person){
if("name".equals(parser.getName())){
person.setName(parser.nextText());
}else if("age".equals(parser.getName())){
person.setAge(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG://结束元素
if("person".equals(parser.getName())&&person!=null){
persons.add(person);
person = null;
}
break;
}
eventCode =parser.next();
}
return persons;
}
}