在Android程序中,Xml解析与Java中几乎相同,最常用的有SAX,DOM,PULL 三种解析方式。Android中内置了pull解析方式。这也是android推荐的解析方式。下面我们就看下这三种的用法,与不同
1)SAX:(Simple API for XML)这种解析方式基于事件的模型。通俗的讲就是XML文件在加载的过程中,加载到不同节点会相应触发不同方法来处理。它属于一次加载。它可以处理任意大小的XML文件,它对内存的要求非常低,因为SAX采用的是读取文件的方式,也就是当它是文本文件在读,读完就完了,什么信息都没有保存。当然它也有其缺点,解析过程中无法中断,只能读取XML文件而不能修改,编码上也相对复杂与难于理解。它的常用方法:
void startDocument()//文档开始时触发该方法
void endDocument()//文档结束时
void startElement(String uri, String localName, String qName, Attributes atts)//元素开始
void endElement(String uri, String localName, String qName)//元素结束
void characters(char[ ] ch, int start, int length)//文本节点
创建SAX解析器:
(1)用系统默认值来创建一个XMLReader(解析器):
XMLReader reader = XMLReaderFactory.createXMLReader();
(2)从给定的类名称来创建一个XMLReader :
XMLReader reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
(3)使用javax.xml.parsers包中的SAXParserFactory类和SAXParser类创建:
SAXParserFactory spFactory = SAXParserFactory.newInstance();
SAXParser sParser = spFactory.newSAXParser();
2)DOM:(Document Object Model)文档对象模型,它是基于对象的,又或者基于树的。它属于两次加载,首先把文档载入内存,第二次把文档解析形成一棵树。如果文档过大对内存占用是很大的。但它也有其优点,它可以解析的过程中修改文件树,可以随便存储文件树的任意部分,相对容易理解。
3)Pull解析:android中内置了pull解析包。这也是android程序中所推荐的xml解析方式。从它的字面上就可以看出来,其优点,pull,拉的意思。我要什么资源我就拿什么资源。我只需要xml文件中一部分,我就拉一部分。从而节省资源,提高效率。当然在J2EE中也可以使用Pull解析。Pull解析也非常易于理解。
先列出xml 文件:放到assets目录下。
<?xml version="1.0" encoding="utf-8"?> <rivers> <river name="灵渠" length="605"> <introduction> 灵渠在广西壮族自治区兴安县境内,是世界上最古老的运河之一,有着“世界古代水利建筑明珠”的美誉。灵渠古称秦凿渠、零渠、陡河、兴安运河,于公元前214年凿成通航,距今已2217年,仍然发挥着功用。 </introduction> <imageurl> http://imgsrc.baidu.com/baike/pic/item/389aa8fdb7b8322e08244d3c.jpg </imageurl> </river> </rivers>
再列出映射类:
import java.io.Serializable;
public class River implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public String getImageurl() {
return imageurl;
}
public void setImageurl(String imageurl) {
this.imageurl = imageurl;
}
private int length;
private String introduction;
private String imageurl;
}
下面开始解析,从
先对DOM方法进行展示:
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import entity.River;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_table);
try {
InputStream is = this.getResources().getAssets().open("river.xml");
List<River> rivers = this.getRiversFromXml( is);
System.out.println(rivers.size());
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//获取全部河流数据
/**
* 参数fileName:为xml文档路径
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
public List<River> getRiversFromXml( InputStream inputStream) throws SAXException, IOException, ParserConfigurationException{
DocumentBuilderFactory f=DocumentBuilderFactory.newInstance();
DocumentBuilder builder = f.newDocumentBuilder();
Document doc=builder.parse(inputStream);
NodeList list=doc.getElementsByTagName("river");
List<River> rivers = new ArrayList<River>();
for(int i=0;i<list.getLength();i++){
Element el=(Element) list.item(i);
River river = new River();
river.setImageurl(this.getSubelementTextContentByName(el, "imageurl"));
river.setIntroduction(this.getSubelementTextContentByName(el, "introduction"));
river.setLength(Integer.parseInt( el.getAttribute("length")));
river.setName(el.getAttribute("name"));
rivers.add(river) ;
}
return rivers;
}
private String getSubelementTextContentByName(Element el, String name) {
NodeList list=el.getElementsByTagName(name);
Element e=(Element) list.item(0);
return e.getTextContent();
}
}
Pull解析代码:
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.view.Menu;
import entity.River;
public class MainActivity extends Activity {
private String tagName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_table);
InputStream is;
try {
is = this.getResources().getAssets().open("river.xml");
List<River> rivers = this.getRiversFromXml( is);
System.out.println(rivers.size());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//获取全部河流数据
/**
* 参数fileName:为xml文档路径
* @throws XmlPullParserException
* @throws IOException
*/
public List<River> getRiversFromXml( InputStream in) throws XmlPullParserException, IOException {
List<River> rivers=null;
River river=null;
XmlPullParser parser=Xml.newPullParser();
parser.setInput(in, "utf-8");
//获取事件类型
int eventType=parser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
//文档开始
case XmlPullParser.START_DOCUMENT:
rivers=new ArrayList<River>();
break;
case XmlPullParser.START_TAG:
tagName = parser.getName();
if("river".equals(tagName)){
river=new River();
river.setName( parser.getAttributeValue(0));
river.setLength(Integer.parseInt( parser.getAttributeValue(1)));
}else if("introduction".equals(tagName)){
river.setIntroduction( parser.nextText());
}else if("imageurl".equals(tagName)){
river.setImageurl( parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if("river".equals(parser.getName())){
rivers.add(river);
}
break;
}
eventType=parser.next();
}
return rivers;
}
}