java文档操作之—— SAX解析
1.相关概念略解
【序列化】把一个对象的状态信息转化为可以存储或者传输的形式的过程
- 序列化: 把对象转化成二进制信息的过程
反序列化:把二进制信息转回对象的过程
序列化的目的:
- 以某种形式使自定义对象永久保存
- 将对象从一个地方传输到另一个地方
【XML】 可拓展标记语言
XML的作用
将数据格式转化成XML格式之后,真正实现了跨平台的数据共享
在不同语言中,XML的解析方式都是一样的
SAX 解析优缺点
优点:占用内存小
缺点:只读只进,一次读取
XML语法规则
1. 所有元素必须有关闭标签
2. 大小写敏感
3. 必须正确的嵌套
4. 必须有根元素
5. 属性值必须加引号
6. 空格会被保留
xml文件举例:
<?xml version="1.0" encoding="utf-8"?>
<fruits>
<fruit id="1">
<name>苹果</name>
<price>3.0</price>
<count>51</count>
</fruit>
<fruit id="2">
<name>香蕉</name>
<price>3.5</price>
<count>17</count>
</fruit>
<fruit id="3">
<name>生梨</name>
<price>2.5</price>
<count>15</count>
</fruit>
<fruit id="4">
<name>桃子</name>
<price>5.0</price>
<count>10</count>
</fruit>
<fruit id="5">
<name>西瓜</name>
<price>10.0</price>
<count>20</count>
</fruit>
</fruits>
2.代码实例
本文章共有两种方式解析,第一章是使用相关jar包来操作,第二种是使用java原生代码实现(反射)
关于jar包的下载请百度
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* SAX解析(jar包) 方式一
* @author yujie
*
*/
public class SN_9IO_SAX_JAR {
public static void main(String[] args) {
parse();
}
public static void parse() {
//1.获取SAXReader对象
SAXReader saxReader = new SAXReader();
//2.获取需要解析的文件
File file = new File("person.xml");
//3.解析文件获取Document对象
Document read =null;
try {
read = saxReader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
//4.解析文件获取文件中的根节点
Element rootElement = read.getRootElement();
//获取所有的节点属性
List<Element> elements = rootElement.elements();
for (Element element:elements) {
System.out.println(element.attributeValue("name"));
}
}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* SAX解析(反射) 方式二(繁琐,不需要导入 jar包 提供参考)
* @author yujie
*
*/
public class SN_9IO_SAX {
private static ArrayList<Person> list;
public static void main(String[] args) {
parse();
}
/**
* SAXParserFactory ——> SAXParser
*/
public static void parse() {
try {
FileInputStream fis = new FileInputStream("person.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
//解析
parser.parse(fis, new MyHandler());
//打印
for(Person p:list) {
System.out.println(p);
}
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
static class MyHandler extends DefaultHandler {
private static Person person;
private static String upTag;//上一次读到的标签
@Override
public void startDocument() throws SAXException {
super.startDocument();
list = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
super.startElement(uri, localName, qName, attributes);
if("person".equals(qName)) {
person = new Person();
person.setName(attributes.getValue(0));
}else {
upTag = qName;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String c = new String(ch, start, length);
switch (upTag) {
case "age":
person.setAge(Integer.parseInt(c));
break;
case "job":
person.setJob(c);
break;
default:
break;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if("person".equals(qName)) {
list.add(person);
person = null;
}
upTag = null;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
list.trimToSize();
System.out.println("解析完成");
}
}
}