xml解析与序列化

1.解析:
1) dom/dom4j:
缺点:占内存,会将文件全部读入内存后开始解析
2.)SAX:
缺点:一旦开始解析就不会停止,直到文件解析完成
3.)Pull:
解决了SAX解析不能停止的问题。

2.序列化:(将数据写到本地)
private void writeXmlToLocal(){
try {
// 获得序列号对象
XmlSerializer serializer = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(), “person.xml”);
FileOutputStream fos = new FileOutputStream(file);
// 指定序列号对象输出的位置和编码
serializer.setOutput(fos, “utf-8”);

// 开始写
serializer.startDocument("utf-8", true);

serializer.startTag(null, "persons");  // <persons>     

for(int i=0;i<personList.size();i++){
    Person person = personList.get(i);      

    serializer.startTag(null, "person");  // <person>
    serializer.attribute(null, "id", Integer.parseInt(person.getId()));   // <person id="">

    serializer.startTag(null, "name");
    serializer.text(person.getName());
    serializer.endTag(null, "name");  

    serializer.startTag(null, "age");
    serializer.text(person.getAge());
    serializer.endTag(null, "age");  

    serializer.endTag(null, "person");   // </person>
}           
serializer.endTag(null, "person");   // </persons>

serializer.endDocument();

} catch (Exception e) {
e.printStackTrace();
}
}

3.反序列化:(从本地读取数据解析为对象)
private List parseXmlFromLocal(){
try {
File file = new File(Environment.getExternalStorageDirectory(),”person.xml”);
FileInputStream fis = new FileInputStream(file);

// 获得解析器对象
XmlPullParser parse = XmlPullParserFactory.newInstance().newPullParser();

// 获得事件类型
int eventType = parse.getEventType();

List<Person> personList = null;
Person person = null;
String id = null;

while(eventType!=XmlPullParser.END_DOCUMENT){
    // 当前节点名称
    String tagName = parse.getName();

    switch (eventType) {
    case XmlPullParser.START_TAG:
        if("persons".equals(tagName)){
            personList = new ArrayList<Person>();
        } else if("person".equals(tagName)){
            person = new Person();
            id = parse.getAttributeValue(null, "id");
            person.setId(Integer.parseInt(id));
        } else if("name".equals(tagName)){
            person.setName(parse.nextText());
        } else if("age".equals(tagName)){
                person.setAge(Integer.parseInt(parse.nextText()));
        }
        break;

    case XmlPullParser.END_TAG:
        if("person".equals(tagName)){
            personList.add(person);
        }
        break;
    }

    // 获得下一个事件类型
    eventType = parse.next();
}

return personList;

} catch (Exception e) {
e.printStackTrace();
}
return null;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值