一、什么是XML解析?
XML是一种简单通用的数据格式,很多配置文件和简单的存储文件都是由这种格式组成的,他的好处是格式清晰、易读。大名鼎鼎的EXCEL文件就可以转换为XML格式存储和传递。
XML的解析顾名思义就是对这种格式的文件做出解读,分析出其中的数据格式,得到有用的数据。
二、为什么要用XML?
数据在传递的时候,要尽可能的小巧,XML文件能够很好的用少量字符,表达格式和数据的关系。他比JSON的好处是更加易读和对UI界面比较友好。
三、如何解析?
1.pull解析
通过pull可以很方便的解析XML格式,他的优点是快速,小巧。
以下实力码代码。
private void parseXMLWithPull() {
try {
XmlResourceParser xmlResourceParser = getResources().getXml(R.xml.apps);
int eventType = xmlResourceParser.getEventType();
String id = "";
String name = "";
String version = "";
while (eventType != XmlPullParser.END_DOCUMENT){
String nodeName = xmlResourceParser.getName();
switch (eventType){
//节点开始时,读取数据
case XmlPullParser.START_TAG:
if("id".equals(nodeName)){
id = xmlResourceParser.nextText();
}else if("name".equals(nodeName)){
name = xmlResourceParser.nextText();
}else if("version".equals(nodeName)){
version = xmlResourceParser.nextText();
}
break;
//节点结束时,打印出数据
case XmlPullParser.END_TAG:
if("app".equals(nodeName)){
Log.i("info","id is " + id);
Log.i("info","name is " + name);
Log.i("info","version is " + version);
}
break;
}
//转到下一个节点
eventType = xmlResourceParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
Log.i("info","解析错误");
} catch (IOException e) {
e.printStackTrace();
Log.i("info","IO错误");
}
}
代码有注释,就不详细介绍了,可以看到pull解析,是以节点为单位来解析的,一个节点一个节点的向下解析。所以比较方便灵活,但不适合解析复杂的数据。
2.sax解析
sax的解析方式,比较传统,是把所有数据先统一读取,然后规划好读取方式后再进行分析读取的。
他需要先继承一个DefaultHandler的类来实现其方法。
public class SaxParserHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {
super.startDocument();
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
nodeName = localName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if("app".equals(localName)){
Log.i("info","id = " + id.toString().trim());
Log.i("info","name = " + name.toString().trim());
Log.i("info","version = " + version.toString().trim());
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if("id".equals(nodeName)){
id.append(ch,start,length);
}else if("name".equals(nodeName)){
name.append(ch,start,length);
}else if("version".equals(nodeName)){
version.append(ch,start,length);
}
}
}
主要就实现这几个方法,包括开始文件读取,结束文件读取,开始节点读取,结束节点读取,开始数据读取,这5个重要的方法。
最后在主方法调用他们就行了。
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
SaxParserHandler saxParserHandler = new SaxParserHandler();
saxParser.parse(new InputSource(getResources().openRawResource(R.raw.apps)),saxParserHandler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
Log.i("info","Sax配置错误");
} catch (SAXException e) {
e.printStackTrace();
Log.i("info","解析错误");
} catch (IOException e) {
e.printStackTrace();
Log.i("info","IO错误");
}
3.dom方式解析
这个用的不多,主要我也没代码可码,就不说了。。