在开发中经常会和XML数据打交道,尽管在工作中已经有相关负责人将代码封装好了,但我认为还是应该学习一些关于xml解析的知识,便于日后的开发工作。
xml被广泛应用于Java编程之中,目前比较有名的框架都有对xml的支持,比如Spring、Mybatis在开发中常用的方式是用xml方式配置,
在开发中经常使用到的web service是使用xml协议传输数据的。所以我认为有必要学习一些xml解析的知识,并以此作为笔记。
xml文件中包含各个节点,每一个节点之中都用来存储数据。
定义一个xml文件:Person.xml
<?xml version="1.0" encoding="utf-8" ?>
<Persons>
<Person id="1">
<name>jack</name>
<age>18</age>
<sex>男</sex>
</Person>
<Person id="2">
<name>rose</name>
<age>20</age>
<sex>女</sex>
</Person>
<Person id="3">
<name>tom</name>
<age>28</age>
<sex>男</sex>
</Person>
</Persons>
然后根据xml文件的内容编写一个对应的Java bean。
package xml.bean;
public class Person {
private int id;
private String name;
private String sex;
private int age;
public Person() {
}
public Person(int id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
开始编写SaxParserHandler,sax处理xml文件常用到一下五个方法,也是sax解析xml文件的流程:
startDocument —>文档读取开始
startElement —>标签读取开始
characters —>读取标签的内容
endElement —>标签读取结束
endDocument —>文档读取结束
sax处理xml文档时,首先会读取该文档,调用startDocument 方法,标志着xml文件解析的开始,然后是逐标签读取,方式是读取开始标签调用startElement、读取标签内容调用characters、读取结束标签调用endElement。
package xml.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import xml.bean.Person;
import java.util.ArrayList;
import java.util.List;
public class SaxParserHandler extends DefaultHandler {
public List<Person> list = null;
Person person = null;
String value = "";
//文档开始
@Override
public void startDocument() throws SAXException {
super.startDocument();
list = new ArrayList<>();
System.out.println("解析开始");
}
//文档结束
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析结束");
}
//遍历开始标签
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.trim().equals("Person")) {
person = new Person();
int id = Integer.parseInt(attributes.getValue("id"));
person.setId(id);
}
}
//遍历结束标签
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.trim().equals("Person")) {
list.add(person);
person = null;
} else if (qName.trim().equals("name"))
person.setName(value);
else if (qName.trim().equals("age"))
person.setAge(Integer.parseInt(value));
else if (qName.trim().equals("sex"))
person.setSex(value);
}
//获取元素值
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
value = new String(ch, start, length);
}
}
最后是对该方式的测试:
package xml.saxtest;
import org.junit.Test;
import org.xml.sax.SAXException;
import xml.bean.Person;
import xml.sax.SaxParserHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class SaxTest {
@Test
public void test() throws ParserConfigurationException, SAXException, IOException {
//获取sax解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//通过工厂获取SaxParser实例
SAXParser parser = factory.newSAXParser();
//实例化自己创建的SaxParserHandler
SaxParserHandler handler = new SaxParserHandler();
File file = new File("src/person.xml");
parser.parse(file, handler);
List<Person> list = handler.list;
System.out.println(list.toString());
}
}
以上是对使用sax方式解析xml文件的方式,代码托管在GitHub和CSDN下载上,地址如下
GitHub地址:
https://github.com/JetBraind/DataParser.git
CSDN下载地址:
http://download.csdn.net/download/feixiang_gao/10218725