1.pull解析
import java.io.IOException;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
/**
* 1.原理
* sax ,以事件作为驱动进行文档的驱动
* handler--> startDocument() startelement() end.... characters()
* 2.pull 和sax类似
* 获取eventType,事件类型--------》判断事件类型,根据不同的事件,做不同的事。
* 3.josn和xml的优缺点
* 优点 缺点
* xml: 扩展性好,xml可以包含json. 结构复杂,解析麻烦
* json:结构简单,解析简单 扩展性差
*/
public class MainActivity extends Activity {
private Button bt;
private ListView lv;
private ArrayList
list;
private Person person;
private int eventType;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
lv = (ListView) findViewById(R.id.lv);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*1.factory
*2.解析者
*3.解析
*/
XmlPullParser pullParser = Xml.newPullParser();//获得解析者
try {
//pull解析者用输入流,解析文件
pullParser.setInput(getAssets().open("source.xml"), "UTF-8");
list = new ArrayList
();
//获取事件类型
eventType = pullParser.getEventType();
//如果文档没有结束,就一直循环
while(eventType!=XmlPullParser.END_DOCUMENT){//判断事件不是文档结束的时候
Log.e("Tag","sart_DOCUMENT-----------------------");
switch (eventType) {
//判断xml节点名字
case XmlPullParser.START_TAG://解析者开始标签
//获取节点名字
String name = pullParser.getName();
if(name.equals("person")){
person = new Person();//namespace 命名空间
person.setId(pullParser.getAttributeValue(null, "id"));
}else if (name.equals("name")) {
//pullParser.nextText()获取名字,字符串(李明)
person.setName(pullParser.nextText());
}else if (name.equals("age")) {
person.setAge(pullParser.nextText());
}
break;
case XmlPullParser.END_TAG:
//根据节点名字判断该节点是否结束,添加到集合
String name2 = pullParser.getName();
if(name2.equals("person")){
list.add(person);
}
break;
}
//当一个事件结束时,执行下一个事件
eventType = pullParser.next();
}
for (int i = 0; i < list.size(); i++) {
Log.e("Tag","name---"+list.get(i).getName());
}
//展示布局
lv.setAdapter(new ArrayAdapter
(MainActivity.this, android.R.layout.simple_list_item_1, list));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity {
private Button bt;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
lv = (ListView) findViewById(R.id.lv);
}
public void saxPase(View v){
// 1.获取工厂类
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser;
try {
// 2.获取具体解析者
parser = factory.newSAXParser();
// 3.解析/第一个参数:输入流。第二个参数:Handler.默认使用defaulHandler
MyHandler handler = new MyHandler();
parser.parse(getAssets().open("source.xml"), handler);
//在这里创建集合什么用?
ArrayList
arrayList = handler.getPerson();
lv.setAdapter(new ArrayAdapter
(MainActivity.this, android.R.layout.simple_list_item_1,arrayList));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
//具体的解析任务
public class MyHandler extends DefaultHandler{
//变量
private ArrayList
list;
private Person person;
//自定义一个变量
private String tem_tag;
//供外部调用的方法
public ArrayList
getPerson(){
return list;
}
//需要重写5个方法
@Override//开始解析文档的时候调用
public void startDocument() throws SAXException {
//开始文档的时候创建集合
list=new ArrayList
();
super.startDocument();
}
//结束文档时调用
@Override
public void endDocument() throws SAXException {
//可以检验一下。集合中是否有person
for (int i = 0; i < list.size(); i++) {
Log.e("Tag", "--persons-"+list.get(i).getName());
}
}
//开始解析到节点的时候调用-------localname,qname节点名字。 attributes属性
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//把每次解析的节点名,赋值给变量名
tem_tag=localName;
//判断节点名字
if(localName.equals("person")){
person = new Person();
//通过属性,获得josn里的id
String value = attributes.getValue("id");
//通过属性的id给person类设置ID。
person.setId(Integer.parseInt(value));
}
super.startElement(uri, localName, qName, attributes);
}
//节点结束时调用
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//判断,如果是person结束了。添加到集合
if(localName.equals("person")){
list.add(person);
}
}
//拼接字符串
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//拼接字符串
String string=new String(ch,start,length);
if(tem_tag.equals("name")){
person.setName(string);
}else if(tem_tag.equals("age")){
person.setAge(string);
}
}
}
import android.R.integer;
public class Person {
private String name;
private String age;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", id=" + id + "]";
}
}
3.DOM解析
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener{
private ArrayList
list;
private ListView lv;
private Button bt;
/**DOM解析是把整个xml文件都存入虚拟机
* 第一步先把要解析的xml文件存入资源文件assets中
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList
();
bt = (Button) findViewById(R.id.bt);
lv = (ListView) findViewById(R.id.lv);
bt.setOnClickListener(this);
}
//解析文档 1.先创建一个dom的解析工程类
// DocumentBuilderFactory文档创建工厂类.newInstance()实例化一个
public void onClick(View v) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//2.获得一个解析者 factory.newDocumentBuilder()
DocumentBuilder builder = factory.newDocumentBuilder();
//3.解析者去解析文档.--把xml文件解析成文档对象
Document parse = builder.parse(getAssets().open("surce.xml"));
//4.从文档对象中找节点,parse.getDocumentElement() 可以得到文档元素-->element
Element element = parse.getDocumentElement();
//5.获取person节点。element.getElementsByTagName("person") 通过标签名称获取节点
NodeList nodeList = element.getElementsByTagName("person");//nodeList是一个类,里面包含很多person
//遍历
for (int i = 0; i < nodeList.getLength(); i++) {
//找到一个person,就找到一个人
Person person = new Person();
//获取属性(这里把节点Node,转换成元素element)
Element item = (Element) nodeList.item(i);//每一个元素,代表一个person
//获取属性(获得的是string类型的id,转换成int类型)
String attribute = item.getAttribute("id");
//转换成int类型的id
int parseInt = Integer.parseInt(attribute);//通过不同的Id查找子节点
person.id=parseInt;
//取出子节点
NodeList childNodes = item.getChildNodes();
//遍历子节点
for (int j = 0; j < childNodes.getLength(); j++) {
//获取类型
Node node = childNodes.item(j);
short nodeType = node.getNodeType();//节点类型
if(nodeType==Node.ELEMENT_NODE){//判断本节点类型,是否是本元素的节点类型Node.ELEMENT_NODE,而不会是其他的文本类型等
//判断节点名称,是否是xml文件里的文件名称,相等
if(node.getNodeName().equals("name")){
//如果相等,就把xml文件里面的值,存进person对象里。
String name1 = node.getFirstChild().getTextContent();//得到第一个子节点中的值getFirstChild()
//得到里面的文本文档 getTextContent()
//存入person对象中
person.name=name1;
}else if(node.getNodeName().equals("age")){
//如果相等,就把xml文件里面的值,存进person对象里。
String age1 = node.getFirstChild().getTextContent();//得到第一个子节点中的值getFirstChild()
//得到里面的文本文档 getTextContent()
//存入person对象中
person.age=age1;
}
}
}
list.add(person);
}
//循环完成以后,再把他展示出来
lv.setAdapter(new ArrayAdapter
(MainActivity.this, android.R.layout.simple_list_item_1,android.R.id.text1, list));
} catch (Exception e) {
e.printStackTrace();
}
}
}