SAX解析。。。不想寫
BB兩句
不想寫,都是差不多的套路。
走起
首先獲取工廠類,然后獲取用于解析xml的對(duì)象,SAX和DOM是java提供的,不用導(dǎo)入jar包什么的。
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
然后,開始解析,老套路,android不可能把獲取的xml字符串寫到文件中,太麻煩,看上一篇DOM,里面有寫方法。
UserHandler userHandler = new UserHandler();
saxParser.parse(new FileInputStream("src/user.xml"),userHandler);
看UserHandler這是什么鬼,這個(gè)是自己寫的類繼承了DefaultHandler,這個(gè)DefaultHandler又是什么鬼呢。SAX解析最重要的就是這個(gè)類了,所有的解析操作都在這個(gè)類里面。
繼承Defaulthandler復(fù)寫他的方法
看代碼
public class UserHandler extends DefaultHandler {
private UserBean userBean = null;
private List<UserBean> userBeanList = null;
private String name;
/**
* 解析到根節(jié)點(diǎn)執(zhí)行,基本上算是只執(zhí)行一次,可以在這里進(jìn)行相關(guān)初始化操作
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
userBeanList = new ArrayList<>();
}
/**
* 解析完成執(zhí)行該方法,其他方法還有很多,可復(fù)寫之后打印生命周期進(jìn)行了解
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
/**
* 解析到每個(gè)節(jié)點(diǎn)的時(shí)候調(diào)用該方法,也就是多次調(diào)用,調(diào)用次數(shù)看xml子節(jié)點(diǎn)有多少,參數(shù)直接打印出來查看
* @param uri
* @param localName
* @param qName 節(jié)點(diǎn)名字
* @param attributes 屬性
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
name = qName;
if ("user".equals(qName)){
userBean = new UserBean();
for (int i = 0; i < attributes.getLength(); i++) {
userBean.setId(attributes.getValue(i));
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("user".equals(qName)){
userBeanList.add(userBean);
userBean = null;
}
}
/**
* 嗯哼,打印出來看看,new String(ch, start, length).trim();這個(gè)是獲取當(dāng)前節(jié)點(diǎn)的值,new String(ch)可以打印出看看,我第一次看也是懵逼了
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String str = new String(ch, start, length).trim();
if (!"".equals(str)) {
if ("name".equals(name)){
userBean.setName(str);
}else if ("age".equals(name)){
userBean.setAge(str);
}
}
}
public List<UserBean> getUserBeanList(){
return userBeanList;
}
}
UserBean
public class UserBean {
private String name;
private String age;
private String 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 String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "UserBean{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
簡(jiǎn)單解析到此結(jié)束