SAXParserFactory解析XML文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/84846363

1),person.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persons>
    <person>
        <name>至尊宝</name>
        <age>99</age>
    </person>
    <person>
        <name>紫霞仙子</name>
        <age>89</age>
    </person>

    <person>
        <name>白晶晶</name>
        <age>79</age>
    </person>
</persons>

2),创建接受的实体类

package com.hp.xml;

public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

3),创建解析的Handler

package com.hp.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**处理xinl数据的handler
 * @author 晓电脑
 */
public class PersonHandler extends DefaultHandler {
    //接受保存数据的集合
    private List<Person> personList;

    //创建person对象
    private Person person;

    //记录这个标签
    private String tag;


    @Override
    public void startDocument() throws SAXException {
        //创建保存数据的集合对象
        personList=new ArrayList<>();
    }


    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (null != qName){
            tag=qName;
        }
        if (null != qName && qName.equals("person")){
            person=new Person();
        }
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String s = new String(ch, start, length);
        if (null != tag && tag.equals("name")){
            person.setName(s);
        }else if(null != tag && tag.equals("age")){
            person.setAge(Integer.valueOf(s));
        }

    }


    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equals("person")){
            personList.add(person);
        }
        tag=null;
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("接收文件结尾的通知。 ");
    }

    public List<Person> getPersonList() {
        return personList;
    }
}

4),运行的main方法

package com.hp.xml;


import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.util.List;

public class PersomTest {
    public static void main (String[] args) throws ParserConfigurationException, SAXException, IOException {

        //1),获得解析工厂 SAXParserFactory
        SAXParserFactory parserFactory = SAXParserFactory.newInstance();
        //2),工厂获取解析器SAXParser
        SAXParser saxParser = parserFactory.newSAXParser();
        //3),加载文档Document

        //4),编写处理器
        PersonHandler handler = new PersonHandler();
        saxParser.parse(
                Thread.currentThread().getContextClassLoader().getResourceAsStream("com/hp/xml/person.xml")
                ,handler
        );

        List<Person> personList = handler.getPersonList();
        personList.forEach(e-> System.out.println(e.getName() + "--->" + e.getAge()));

    }
}

运行效果为

总结一下:

基本解析方式有俩种:

1),SAX,SAX是基于事件流的解析方式

2),DOM,DOM是基于XML文档树结构的解析方式

常见的解析方式有以下四种:

1),DOM生成和解析XML文档

2),SAX生成和解析XML文档

3),DOM4J生成和解析XML文档

4),JDOM生成和解析DOM文档

当我第二次自己又写一遍的时候,写的过程中遇到了这样的问题

错误信息是:

Exception in thread "main" java.lang.IllegalArgumentException: InputStream cannot be null
	at javax.xml.parsers.SAXParser.parse(SAXParser.java:191)
	at com.hp.xml.PersonsTest.main(PersonsTest.java:21)

没有读取到XML文件的内容

解决办法:

由于我第二次使用maven创建的web项目,所以资源文件不应该直接放到包下,应该放到resources目录下面,改动如下

                                 

main运行改动如下

    public static void main(String [] args) throws ParserConfigurationException, SAXException, IOException {

        //创建SAX工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //创建SAXParser
        SAXParser saxParser = factory.newSAXParser();
        //创建处理的Handler
        PersonsHandler handler = new PersonsHandler();

        saxParser.parse(
            Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml"),
            handler
        );
        List<PersonsBean> beanList = handler.getPersonsBeanList();
        beanList.forEach(e->System.out.println(e.getKey()+"--->"+e.getVal()));
    }
--得到当前的classpath的绝对路径的URI表示法。
Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml")

扩展:

        // 当前线程的类加载器
        System.out.println(Thread.currentThread().getContextClassLoader());
        // 当前类的类加载器PersonsTest当前类对象
        System.out.println(PersonsTest.class.getClassLoader());
        // 系统初始的类加载器
        System.out.println(ClassLoader.getSystemClassLoader());




//在代码中动态加载jar、资源文件的时候,首先应该是使用
Thread.currentThread().getContextClassLoader()
可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)。
ClassHelper.class.getClassLoader(),
//一般用在getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。
ClassHelper.class.getClassLoader()

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/84846363