首页 > 编程语言 >Java使用SAX解析xml文档

Java使用SAX解析xml文档

时间:2022-11-19 11:55:59浏览次数:46  
标签:xml Java String element person SAX 解析 public name

步骤

1.创建解析工厂

2.从工厂中获取解析器

3.自行编写处理器:继承DefaultHandler,重写相关方法。

4.加载自己的处理器

5.开始解析

6.读取数据

例子

读取此xml文件内容。

创建了一个Persons类来存储数据。

public class Persons {
    private String name;
    private int age;

    public Persons() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

解析过程:

/**
 * Sax解析xml文件
 */
public class SaxXml {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, SAXException {
        //1.获取解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //2.从工厂中获取解析器
        SAXParser parser = factory.newSAXParser();
        //3.编写处理器
        //4.加载文档注册处理器
        PHandler  handler = new PHandler();
        //5.解析
        parser.parse(Thread.currentThread()
                .getContextClassLoader()
                .getResourceAsStream("lrj/xml/p.xml"),handler);
        //6.读取
        List<Persons> list = handler.getPersons();
        for(Persons temp :list){
            System.out.println(temp.getName()+":"+temp.getAge());
        }
    }
}

处理器:

//3.编写处理器
class PHandler extends DefaultHandler {
    private List<Persons> persons;
    private Persons person;
    private String element;//当前正在解析哪个元素

    public List<Persons> getPersons() {
        return persons;
    }

    //文档开始解析,初始化容器
    @Override
    public void startDocument() throws SAXException {
        persons = new ArrayList<>();
    }

    //解析元素内容
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String data = new String(ch,start,length).trim();
        if(null!=element) {//element为空的时候不解析内容(内容为空)
            if (element.equals("name")) {//解析到name的时候
                person.setName(data);
            } else if (element.equals("age")) {//解析到age的时候
                person.setAge(Integer.parseInt(data));
            }
        }
    }

    //解析元素开始
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        element = qName;
        if(element.equals("person")){//开始解析person时候创建一个对象
            person = new Persons();
        }
    }

    //解析元素结束
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        element = qName;
        if(null!=element){
            if(element.equals("person")){//person解析结束,对象加入容器中
                persons.add(person);
            }else if(element.equals("name")||element.equals("age")){//避免解析到空格
                element = null;
            }
        }
    }
}

运行结果:

 

标签:xml,Java,String,element,person,SAX,解析,public,name
From: https://www.cnblogs.com/lurenjia-bky/p/16905783.html

相关文章

  • 深入理解Java引用类型和值调用
    目录引言数据类型分类基本类型引用类型引用分类数据存在哪基本类型与引用类型的区别值传递引用对象传递之例外nullReference引言  什么是数据类型?在计算机科学和计算......
  • Java日期类
    第一代日期类指Date和SimpleDateFormat。前者获取时间,后者格式化时间形式。这两种类已经过时,但在开发中仍然可能用到。构造器Date();//可以放一个时间戳,例如System.......
  • Java基本运算符
    Java基本运算符算术运算符:+,-,*,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=,instanceof(关系运算符返回的结果:正确或错误)逻辑运算符:&&,||,!(与、或、非)......
  • Java(Android)与C++之间的Socket通信
    Java与C++之间的Socket通信,对于小的数据量和控制命令,直接可以封装成json或xml格式,进行传输。但对于文件等大数据量传输,必须要将文件封装成帧,每一帧都设定固定大小的缓冲区,逐......
  • JavaScript语法_流程控制语句和JavaScript语法_流程控制语句
    JavaScript语法_流程控制语句://1.语句以;结尾,如果一行只有一条语句则;可以省略(不建议)//1.语句以;结尾,如果一行只有一条语句则可以省略(不建议)leta=3......
  • C#中XmlTextWriter读写xml文件详细介绍
    XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使用这个类,你必须首先创建一个新的XmlTextWri......
  • Java面试汇总----概念题
    1、集合:    Vector、Hashtable是线程安全的集合对象,    ArrayList、Vector对象的底层是由数组实现的,    LinkedList是线程不安全的,底层是由链表实现的,    M......
  • Java开发环境安装与配置(干货详细教程)
    Java开发环境安装与配置(干货详细教程) 对于文章中出现的任何错误请大家批评指出,会及时做出修改! 安装JDKJDK是Java语言的软件开发工具包链接Java中国官网https:/......
  • JavaScript_对象_Global与DOM简单学习
    JavaScript_对象_GlobalGlobal:全局对象1.特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用。方法名();2.方法......
  • vba的xmlhttp对象的使用
    1、xmlhttp:早期用于远程数据库管理;传送XML数据格式的超长文本传输协议;不仅仅是XML格式;还可以是字符串,二进制流等。2、引用方式(1)直接引用:MicrosoftXML......