版权声明:本文为博主原创文章,未经博主允许不得转载。 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()