Asmack开发系列之xmlPullParser

简介:

XMPP是用XML来进行数据交换的,所以,我们必须对XML有了解。对于XML理论知识,可以去稍微的复习一下。例如,节点,实体,属性等这些。今天,我们需要讲的是xmlPullParser。XML解析库其实有很多,而android平台下非常推崇它,当然XMPP也是,因为它的有点是不需要导入整个xml文件。还记得xmpp的一个特点就是能够传输小片xml文件数据。试想,如果你的xml解析库非得完整的xml文件,那么这和xmpp的设计思想是相冲突的。

这里,我给出一个使用xmlPullParser的例子,抛砖引玉。后续在Asmack中看到它的时候,不至于云里雾里,似懂非懂。

一个存有学生信息的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1" group="1">
        <name>张三</name>
        <sex>男</sex>
        <age>18</age>
        <email>zhangsan@163.com</email>
        <birthday>1987-06-08</birthday>
        <memo>好学生</memo>
    </student>
    <student id="2" group="2">
        <name>李四</name>
        <sex>女</sex>
        <age>18</age>
        <email>lisi@163.com</email>
        <birthday>1987-06-08</birthday>
        <memo>好学生</memo>
    </student>
    <student id="3" group="3">
        <name>小王</name>
        <sex>男</sex>
        <age>18</age>
        <email>xiaowang@163.com</email>
        <birthday>1987-06-08</birthday>
        <memo>好学生</memo>
    </student>
    <student id="4" group="4">
        <name>小张</name>
        <sex>男</sex>
        <age>18</age>
        <email>xiaozhang@163.com</email>
        <birthday>1987-06-08</birthday>
        <memo>好学生</memo>
    </student>
    <student id="5" group="5">
        <name>小明</name>
        <sex>男</sex>
        <age>18</age>
        <email>xiaoming@163.com</email>
        <birthday>1987-06-08</birthday>
        <memo>好学生</memo>
    </student>
</root>

xml对应的bean文件:

package com.parsexml.entity;

public class Student {
    
    private int id;
    private int group;
    private String name;
    private String sex;
    private int age;
    private String email;
    private String memo;
    private String birthday;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getGroup() {
        return group;
    }
    public void setGroup(int group) {
        this.group = group;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMemo() {
        return memo;
    }
    public void setMemo(String memo) {
        this.memo = memo;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    
}
XmlPullParser的解析代码:

package com.parsexml;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import com.parsexml.entity.Student;

public class PullParseXml {
    
    
    public List<Student> PullParseXML(){
        
        List<Student> list=null;
        Student student = null;
        
        //构建XmlPullParserFactory
        try {
            XmlPullParserFactory pullParserFactory=XmlPullParserFactory.newInstance();
            //获取XmlPullParser的实例
            XmlPullParser xmlPullParser=pullParserFactory.newPullParser();
            //设置输入流  xml文件
            xmlPullParser.setInput(Thread.currentThread().getContextClassLoader().getResourceAsStream("Student.xml"), "UTF-8");
            
            //开始
            int eventType=xmlPullParser.getEventType();
            
            try {
                while(eventType!=XmlPullParser.END_DOCUMENT){
                    String nodeName=xmlPullParser.getName();
                    switch (eventType) {
                    //文档开始
                    case XmlPullParser.START_DOCUMENT:
                        list=new ArrayList<Student>();
                        break;
                    //开始节点
                    case XmlPullParser.START_TAG:
                        //判断如果其实节点为student
                        if("student".equals(nodeName)){
                            //实例化student对象
                            student=new Student();
                            //设置Id属性
                            student.setId(Integer.parseInt(xmlPullParser.getAttributeValue(0)));
                            //设置Group属性
                            student.setGroup(Integer.parseInt(xmlPullParser.getAttributeValue(1)));
                        }else if("name".equals(nodeName)){
                            //设置name
                            student.setName(xmlPullParser.nextText());
                        }else if("sex".equals(nodeName)){
                            //设置sex
                            student.setSex(xmlPullParser.nextText());
                        }else if("age".equals(nodeName)){
                            //设置age
                            student.setAge(Integer.parseInt(xmlPullParser.nextText()));
                        }else if("email".equals(nodeName)){
                            //设置email
                            student.setEmail(xmlPullParser.nextText());
                        }else if("birthday".equals(nodeName)){
                            //设置birthday
                            student.setBirthday(xmlPullParser.nextText());
                        }else if("memo".equals(nodeName)){
                            //设置memo属性
                            student.setMemo(xmlPullParser.nextText());
                        }
                        break;
                    //结束节点
                    case XmlPullParser.END_TAG:
                        if("student".equals(nodeName)){
                            list.add(student);
                            student=null;
                        }
                        break;
                    default:
                        break;
                    }
                    eventType=xmlPullParser.next();
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }

        return list;
    }
    
    public static void main(String[] args) {
        List<Student> list=new PullParseXml().PullParseXML();
        for(Student student:list){
            System.out.println("id:"+student.getId()+"\tgroup:"+student.getGroup()+"\tname:"+student.getName()+"\tsex:"+student.getSex()+"\tage:"+student.getAge()+"\temail:"+student.getEmail()+"\tbirthday:"+student.getBirthday()+"\tmemo:"+student.getMemo());
        }
    }
    
}
好,xmpPullParse的示例就到此,这足够在Asmack代码里面混了。
参考及转载:

http://www.blogjava.net/sxyx2008/archive/2010/08/04/327885.html


相关文章
|
3月前
|
人工智能 自然语言处理 Java
Trae 3.0月活破500万:但为什么说Java开发者需要的不是代码补全,而是工程交付?
trae月活突破500万,,Solo Mode 3.0实现无人值守全流程编程。这是AI编程工具的一个里程碑。Trae 3.0的定位从"代码补全"升级到"全流程代理"——自然语言输入需求,AI自动完成编码、测试、部署全链路。它甚至可以在夜间和周末自主运行,批量处理多个项目。
|
3月前
|
存储 人工智能 安全
企业AI知识库搭建指南:从架构设计到落地的全链路工程实践
本文系统梳理企业AI知识库从需求分析到持续运营的全链路工程实践,涵盖异构存储选型、智能文档解析、混合检索设计、RAG管线构建、安全合规保障及性能调优等关键环节,助力技术团队高效落地生产级知识管理系统。(239字)
338 0
 企业AI知识库搭建指南:从架构设计到落地的全链路工程实践
|
2月前
|
存储 架构师 数据库
从DBA到数据架构师:技术债务管理是分水岭
“架构债”在业务快速迭代中被不断放大,最终成为系统稳定性的定时炸弹。本文从数据架构的视角出发,拆解数据库技术债务的四种典型类型,提供识别、评估和偿还的完整方法论,帮助读者从“数据库管理员”升级为“数据架构师”。
|
4月前
|
存储 边缘计算 人工智能
边缘计算+算法定制:如何让视觉AI在场景中真正落地?
视觉AI落地难?算法与场景错位、部署受限、数据合规压力大,导致“看得见却看不懂”。边缘计算盒子+定制化算法,实现本地实时分析、低延时告警、断网可用、数据不出场,让AI真正在工地、加油站、园区等复杂场景用起来。(239字)
558 1
|
4月前
|
人工智能 JSON 机器人
构建 Gerrit AI 代码审查机器人:从零到自动部署
本文介绍如何从零构建Gerrit AI代码审查机器人:通过SSH监听Gerrit事件流,自动获取变更文件,调用大模型进行结构化代码审查(识别高/中/低风险问题),并以Markdown评论+Code-Review打分形式自动提交结果。含断线重连、Base64解码、JSON严格解析等关键实现,支持手动测试与7×24自动部署。(239字)
|
5月前
|
SQL 安全 前端开发
公司要做等保,代码审计报告找谁出?常被误读的合规问题
等保2.0要求三级及以上系统必须提供源代码安全审计报告,作为“安全开发”关键证据。该报告需聚焦逻辑层风险(如SQL注入、越权、硬编码密钥等),非漏洞扫描或渗透测试可替代。合规报告须满足:方法论合规(依据GB/T 39412-2020等)、结果可追溯(精确定位至行号+复现路径)、整改可闭环(含修复建议与免费复测)。服务方应具备CMA、CCRC等法定资质,并采用“自动化扫描+人工深度分析”双轨机制。(239字)
|
5月前
|
存储 人工智能 弹性计算
2026年阿里云服务器便宜购买指南:最新优惠政策、配置选择与省钱技巧
2026年阿里云推出多项云服务器优惠活动,轻量应用服务器2核2G配置仅需38元/年,经济型e实例2核2G 99元/年,通用算力型u1实例2核4G 199元/年。此外,u2i实例享3折起,第九代实例低至6.4折。用户可通过新用户特惠、优惠券及组合购策略,如先购高配产品、使用购物车合并支付、参与组合购活动等,进一步降低成本。通过这些政策和技巧,用户能以更低价格选购适合的云服务器。
|
11月前
|
缓存 Java Spring
JDK-CGLIB-反射
JDK动态代理基于接口,利用反射和Proxy实现;CGLIB通过ASM生成子类,支持无接口类代理,但无法代理final方法。二者性能随JDK版本变化,JDK8后差距缩小。Spring AOP根据是否有接口自动选择代理方式。Java反射机制则允许运行时获取类信息并动态操作对象,是动态代理的基础。
334 0
|
8月前
|
存储 供应链 安全
智慧医疗·区域云HIS源码一体化协同平台 (SaaS版)
专为集团医院、医共体打造的云原生医疗SaaS平台,基于“中心协同、扁平管理”理念,实现全域资源集成与数据共享。覆盖临床、患者服务、供应链及运营监控四大中心,支持五级EMR、医保实时结算、智能预警与多维BI,开箱即用。