XML解析
SAX解析方式
- 顺序扫描,当扫描到文档开始与结束,元素开始与结束的地方通知时间处理函数,解析速度快,占用内存少,解析同步
DefaultHandler帮助类
-
通过该类中方法判断触发事件
-
startDocument
当读到文档开始标志时,完成初始化操作 -
endDocument
文档结束,完成善后 -
startElement
-
endElement 在遇到标签结束,调用这个方法
-
characters(ch,start,length) 处理xml读到的内容,ch存放文件的内容
核心代码
//重写DefaultHandler
public class SaxHelper extends DefaultHandler {
private Person person;
private ArrayList<Person> persons;
//要解析的对象
private String tagName = null;
//文档开始
@Override
public void startDocument() throws SAXException {
this.persons = new ArrayList<Person>();
}
/**
* 读到一个开始标签时调用,第二个参数为标签名,最后一个参数为属性数组
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("person")) {
person = new Person();
person.setId(Integer.parseInt(attributes.getValue("id")));
}
this.tagName = localName;
}
// 读内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//判断当前标签是否有效
if (this.tagName != null) {
String data = new String(ch, start, length);
//读取标签中的内容
if (this.tagName.equals("name")) {
this.person.setName(data);
Log.i("SAX", "处理name元素内容");
} else if (this.tagName.equals("age")) {
this.person.setAge(Integer.parseInt(data));
Log.i("SAX", "处理age元素内容");
}
}
}
//读到元素结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equals("person")) {
this.persons.add(person);//为什么要写上this
person = null;
}
this.tagName = null;
}
//读到文档结尾
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
//获取persons集合
public ArrayList<Person> getPersons() {
return persons;
}
}
pull解析方式
- 采用事件驱动完成xml解析,只需处理开始和结束事件,通常使用switch语句,读到xml返回START_DOCUMENT ,开始标签返回START_TAG , 读到文本返回TEXT,结束标签返回 END_TAG , 结束标签返回 END_DOCUMENT ,
解析流程
- 获得XmlPullParser类的使用
通过xml解析工厂获得实例
XmlPullParserFactory factory=XmlPullParseFactory.newInstance();
XmlPullParser parser=factory.newPullParse();
直接获得实例
XmlPullParser parser=Xml.newPullParser();
- 为parse解析器对象提供xml流和编码格式
parser.setInput(xml,"UTF-8");
- 获得事件类型
int eventType=parser.getEventType();
- 用switch对不同事件类型进行处理
which(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
persons=new ArrayLists<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
person=new Person();
//取出属性值
int id=Integer.parseInt(parser.getAttributeValue(0));
}else if("name".equals(parser.getName())){
String name=parser.nextText();//获取该节点内容
perser.setName(name);
}else if("age".equals(parser.getName())){
int age=Integer.parseInt(parser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("Person".equals(parser.getName())){
parsons.add(person);
person=null;
}
break;
}
eventType=parser.next();
}
JSON解析
- Javascript Object Natation轻量级数据交换格式,良好可读可写
Json和xml比较
- 体积小,与javascript交互更方便,数据描述性差,速度更快
格式规范
// 名称/值对
"id":"1","name":"基神","age":"18" },
JSON字符串解析实例
//Person.java
public class Person {
private String id;
private String name;
private String age;
public void setId(String id){
this.id = id;
}
public String getId(){
return this.id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(String age){
this.age = age;
}
public String getAge(){
return this.age;
}
@Override
//为什么需要toString
public String toString() {
return this.name + "~年方:" + this.age;
}
}
//JSONObject: Json对象,可以完成Json字符串与Java对象的相互转换
//JSONArray: Json数组,可以完成Json字符串与Java集合或对象的相互转换
private void parseDiffJson(String json) {
try {
JSONObject jsonObject1 = new JSONObject(json);
//获取对象
JSONArray jsonArray = jsonObject1.getJSONArray("ch");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
String sname = jsonObject.getString("names");
JSONArray jarray1 = jsonObject.getJSONArray("data");
JSONArray jarray2 = jsonObject.getJSONArray("times");
}
} catch (Exception e) {
e.printStackTrace();
}
}
核心代码
public static ArrayList<Person> getPersons(InputStream xml)throws Exception
{
//XmlPullParserFactory pullPaser = XmlPullParserFactory.newInstance();
ArrayList<Person> persons = null;
Person person = null;
// 创建一个xml解析的工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 获得xml解析类的引用
XmlPullParser parser = factory.newPullParser();
parser.setInput(xml, "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:
if ("person".equals(parser.getName())) {
person = new Person();
// 取出属性值
int id = Integer.parseInt(parser.getAttributeValue(0));
person.setId(id);
} else if ("name".equals(parser.getName())) {
String name = parser.nextText();// 获取该节点的内容
person.setName(name);
} else if ("age".equals(parser.getName())) {
int age = Integer.parseInt(parser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName())) {
persons.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
return persons;
}
本文详细介绍了XML的SAX解析方式,利用DefaultHandler处理XML文档的开始、结束、元素和内容。接着,讲解了XML的Pull解析方式及其解析流程。此外,还对比了JSON与XML的优缺点,并展示了JSON解析的基本步骤和实例。最后,提供了XML和JSON之间的转换示例代码。
1665

被折叠的 条评论
为什么被折叠?



