JAVA 解析XML 中SAX解析方式是通过继承DefaultHandler类解析的,重写DefaultHandler中的方法来读取每一行的元素,获取标签、属性和内容。
1、写一个类继承DefaultHandler
重写 startElement、endElement、startDocument、endDocument、characters五个方法
public class SAXParseHandle extends DefaultHandler {
/**
*
* SAX方式解析xml文件 并保存数据
*
* */
/**
* 遍历开始标签
* 每解析元素开始标签就执行这个方法
*
* */
List<Employee> empList=new ArrayList<>();
int empIndex=0;
private Employee emp;
String context;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("employee")) {
empIndex++;
emp=new Employee();
System.out.println("-----------------第"+empIndex+"个员工开始----------------");
//如果知道属性名、根据属性名称获取属性值
//String value = attributes.getValue("id");
//System.out.println("employee"+value);
int length=attributes.getLength();
//如果不知道属性的名称和个数
for (int i = 0; i < length; i++) {
String name = attributes.getQName(i);
String value= attributes.getValue(i);
System.out.print("name:"+name+" value:"+value+",");
if ("id".equals(name)) {
emp.setId(value);
}
}
System.out.println();
}else if (!qName.equals("department") && !qName.equals("employee")) {
System.out.print("节点名:"+qName+" 节点值:");
}
}
/**
* 遍历结束标签
* 每解析元素结束标签就执行这个方法
* */
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if ("name".equals(qName)) {
emp.setName(context);
}
else if ("age".equals(qName)) {
emp.setAge(context);
}
else if ("sex".equals(qName)) {
emp.setSex(context);
}else if (qName.equals("employee")) {
System.out.println();
System.out.println("---------------第"+empIndex+"个员工结束------------------");
empList.add(emp);
}
}
/**
* 解析开始
* */
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 解析结束
* */
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
System.out.println("size"+empList.size());
for (Employee employee : empList) {
System.out.println("name :"+employee.getName());
System.out.println("age :"+employee.getAge());
System.out.println("sex :"+employee.getSex());
}
}
/**
* 获取节点值
*
* ch 整个节点的内容
* start 节点值开始索引
* length 节点值的长度
*
* */
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
context = new String(ch,start,length);
if (!"".equals(context.trim()) && context.trim().length()>0) {
System.out.print(context);
}
System.out.println();
}
}
2、SAX解析方法测试类
public class SAX_Parse {
public static void main(String[] args) {
//获取SAXParserFactory实例
SAXParserFactory factory=SAXParserFactory.newInstance();
//通过facory获取SAXParser实例
try {
SAXParser parser= factory.newSAXParser();
SAXParseHandle handler=new SAXParseHandle();
parser.parse("department.xml", handler);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}