2種類のXML解析SAX解析とPull解析
SAX , DOM 。
DOM原理:まずファイルをメモリに格納されたツリー構造に読み込みます.メモリのため、操作と管理が容易ですが、リソースと時間を無駄にします.
SAX原理:イベントに基づいて、xmlに読み込まれたノードは、ノード名に基づいて対応するデータを読み取り、リソースを消費することが少ないことを示します.しかし、ステータスがなく、持続的ではなく、データが保存されていなければ存在しません.
DOM 4 J:とても強くて.
JDOM:SAXのパッケージです.簡単な作成と解析に適しています.
今日使用した例は,アンドロイドが使用するSAXとアンドロイドが持参したPull解析である.
まず実験を見てみましょうxml
<?xml version="1.0" encoding= "UTF-8"?>
<citys>
<city id= "23">
<name>nice</name>
<number>30</ age>
</city>
<city id="20">
<name>work</name>
<number>23</ age>
</city>
</citys>
第一の解析方式SAX
/**
* SAX
*/
@Override
public List<City> parseXmlBySax(InputStream iis) throws Exception {
List<City> list = new ArrayList<City>();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser(); //
CityContextHandler handler = new CityContextHandler();
parser.parse(iis, handler); //
iis.close(); //
list = handler.getList();
return list;
}
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* DefaultHandler
* startDocument() startElement() endElement() characters()
* xml JavaBean
*
* @author suibian
*
*/
public class CityContextHandler extends DefaultHandler {
private List<City> list=null;
private City city=null;
private String targetname=null;
public List<City> getList() {
return list;
}
/**
*
*/
@Override
public void startDocument() throws SAXException {
list=new ArrayList<City>();
}
/**
*
* city
* name set
* location set
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(localName.equals("citys")){ //
return;
}
if(localName.equals("city")){
this.city=new City();
city.setId(Integer.valueOf(attributes.getValue("id")));
}
this.targetname=localName;
}
/**
* city city=null
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(localName.equals("city")){
list.add(city);
city=null;
}
this.targetname=null;
}
/**
* JavaBean
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String data=new String(ch,start,length);
if(this.targetname!=null&&(!(data.equals("")))){
if(this.targetname.equals("name")){
this.city.setName(data);
}else{
this.city.setNumber(data);
}
}
}
}
第2のPull解析
/**
* Pull
* :
* ,
*/
@Override
public List<City> parseXmlByPull(InputStream iis) throws Exception {
List<City> list = null;
City city = null;
XmlPullParser pull = XmlPullParserFactory.newInstance().newPullParser();
pull.setInput(iis, "UTF-8");
int event = pull.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<City>();
break;
case XmlPullParser.START_TAG:
if (pull.getName().equals("city")) {
city = new City();
city.setId(Integer.valueOf(pull.getAttributeValue(0)));
}
if (pull.getName().equals("name")) {
city.setName(pull.nextText());
}
if (pull.getName().equals("number")) {
city.setNumber(pull.nextText());
}
break;
case XmlPullParser.END_TAG:
if (pull.getName().equals("city")) {
list.add(city);
city = null;
}
break;
}
event = pull.next();
}
return list;
}
これは私を困惑させて久しくて、誤りが現れてどうしてsetup()must be......@1 nullなんて覚えていません.これはテストを提示するときに1つのスレッドに入れなければ解析できません.その後、https://github.com/blogやっと見つけた答えは、英語のレベルが無理に読めてよかった.
DOM解析についてはあまり話さないが、とにかく言いたいのは、これはただの道具で、使うだけで、原理がわかったらいいということだ.
私は菜鳥です.道にいます.
2015年5月17日23:48:20