目录
- 一、Xml格式数据简单理解
- 二、Pull解析
- 1、使用步骤
- 1)创建解析器工厂对象
- 2)从工厂中获取解析器对象
- 3)设置解析器输入流
- 4)获得事件的类型
- 5)解析并显示
- 2、案例
- 三、SAX解析
- 1、使用步骤
- 1)创建一个类集成DefaultHandler,重写其方法
- 2)得到SAX解析工厂
- 3)创建SAX解析器
- 4)创建自己的XML解析处理器
- 5)将解析处理器分配给解析器
- 6)得到数据
- 2、案例
一、Xml格式数据简单理解
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="1">
<name>zhangshan</name>
<age>20</age>
</person>
<person id="2">
<name>lisi</name>
<age>25</age>
</person>
<person id="3">
<name>wangwu</name>
<age>30</age>
</person>
</persons>
<!--开始元素(标签)persons-->
<!--开始元素(标签) 属性名称=“属性的值”-->
<!--开始元素(标签) 元素内容 结束元素(标签)-->
<!--开始元素(标签) 元素内容 结束元素(标签)-->
<!--结束元素(标签)-->
......
<!--结束元素(标签)-->
二、Pull解析
1、使用步骤
1)创建解析器工厂对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2)从工厂中获取解析器对象
XmlPullParser parser = factory.newPullParser();
3)设置解析器输入流
parser.setInput(inputStream,"UTF-8");
4)获得事件的类型
int eventType = parser.getEventType();
- START_DOCUMENT
开始读文档时触发,在这里完成一些初始化操作 - START_TAG
开始标签(元素)
通过XmlPullParser的getName()方法获取标签名进行比较。
//获取属性的值
parser.getAttributeValue(String namespace,String name)
//获取元素内容
parser.nextText()
- END_TAG
结束标签(元素) - XmlPullParser.next()
到下一个标签(元素)
5)解析并显示
2、案例
res/raw下自定义一个persons.xml文件
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="1">
<name>zhangshan</name>
<age>20</age>
</person>
<person id="2">
<name>lisi</name>
<age>25</age>
</person>
<person id="3">
<name>wangwu</name>
<age>30</age>
</person>
</persons>
定义一个Person类
public class Person {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
解析并显示
public class MainActivity extends AppCompatActivity {
private Button pull;
private Button sax;
private TextView data;
private InputStream is;
private ArrayList<Person> personList = new ArrayList<>();
private StringBuffer sb = new StringBuffer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pull = findViewById(R.id.pull);
sax = findViewById(R.id.sax);
data = findViewById(R.id.data);
is = getResources().openRawResource(R.raw.persons);
//pull解析
pull.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
personList = xmlByPull(is);
for(int i = 0; i < personList.size(); i++){
String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName() + " , age = " + personList.get(i).getAge() + ".\n";
sb.append(message);
}
data.setText("Xml数据:\n" + sb.toString());
}
});
//sax解析
sax.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
ArrayList<Person> xmlByPull(InputStream inputStream){
ArrayList<Person> arrayList = null;
Person person = null;
try {
//创建解析器工厂对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//从工厂中获取解析器对象
XmlPullParser parser = factory.newPullParser();
//设置解析器输入流
parser.setInput(inputStream,"UTF-8");
//获得事件的类型
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String name = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
arrayList = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("person".equals(name)) {
person = new Person();
//该节点有id属性,则获取id属性
int id = Integer.parseInt(parser.getAttributeValue(null, "id"));
person.setId(id);
}
if (person != null) {
if ("name".equals(name)) {
person.setName(parser.nextText());
}
if ("age".equals(name)) {
person.setAge(new Integer(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(name)) {
arrayList.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return arrayList;
}
}
三、SAX解析
1、使用步骤
1)创建一个类集成DefaultHandler,重写其方法
public class SaxHandler extends DefaultHandler {
// 文档开始时,调用此方法。在这里完成一些初始化操作
@Override
public void startDocument() throws SAXException {
}
// 标签开始时,调用此方法
// uri:命名空间
// localName:不带命名空间前缀的标签名
// qName:带命名空间前缀的标签名
// attributes:属性
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
}
// 读到内容时,调用此方法
// ch:元素内容
// start:起始位置
// length:内容长度
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
}
// 标签结束时,调用此方法
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
}
// 文档结束时,调用此方法
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
2)得到SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
3)创建SAX解析器
SAXParser saxParser = factory.newSAXParser();
4)创建自己的XML解析处理器
SaxHandler saxHandler = new SaxHandler();
5)将解析处理器分配给解析器
saxParser.parse(inputStream, saxHandler);
6)得到数据
2、案例
自定义解析处理器
public class SaxHandler extends DefaultHandler {
private ArrayList<Person> personList = null;
private Person person = null;
private String tagName = null;
public ArrayList<Person> getPersons() {
return personList;
}
// 文档开始时,调用此方法。在这里完成一些初始化操作
@Override
public void startDocument() throws SAXException {
personList = new ArrayList<>();
}
// 标签开始时,调用此方法
// uri:命名空间
// localName:不带命名空间前缀的标签名
// qName:带命名空间前缀的标签名
// attributes:属性
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("person".equals(localName)) {
person = new Person();
person.setId(Integer.parseInt(attributes.getValue("id")));
}
tagName = localName;
}
// 读到内容时,调用此方法
// ch:元素内容
// start:起始位置
// length:内容长度
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (tagName != null) {
String data = new String(ch, start, length);
if ("name".equals(tagName)) {
person.setName(data);
}
if ("age".equals(tagName)) {
person.setAge(Integer.parseInt(data));
}
}
}
// 标签结束时,调用此方法
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("person".equals(localName)) {
personList.add(person);
person = null;
}
tagName = null;
}
// 文档结束时,调用此方法
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
public class MainActivity extends AppCompatActivity {
private Button pull;
private Button sax;
private TextView data;
private InputStream is;
private ArrayList<Person> personList = new ArrayList<>();
private StringBuffer sb = new StringBuffer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pull = findViewById(R.id.pull);
sax = findViewById(R.id.sax);
data = findViewById(R.id.data);
is = getResources().openRawResource(R.raw.persons);
//sax解析
sax.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
personList = xmlBySAX(is);
for(int i = 0; i < personList.size(); i++){
String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName() + " , age = " + personList.get(i).getAge() + ".\n";
sb.append(message);
}
data.setText("Xml数据:\n" + sb.toString());
}
});
}
ArrayList<Person> xmlBySAX(InputStream inputStream) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
SaxHandler saxHandler = new SaxHandler();
saxParser.parse(inputStream, saxHandler);
return saxHandler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}