Demo:
package com.sax;
import java.io.File;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class ReadXML2Obj {
public static void main(String[] args) throws Exception {
//创建SAXParser
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
File file = new File("./src/contact4.xml");
MyReadXML2ObjHandler handler = new MyReadXML2ObjHandler();
//解析xml
parser.parse(file, handler);
List<Contact> contactList = handler.getContactList();
for(Contact c : contactList){
System.out.println(c);
}
}
}
MyReadXML2ObjHandler .java:
package com.sax;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyReadXML2ObjHandler extends DefaultHandler {
//存放所有Contact对象
private List<Contact> list = new ArrayList<Contact>();
//存放一个Contact对象信息
private Contact contact = null;
//获取的当前文本内容
private String data = null;
//获取当前读到的标签名
private String eleName = null;
/**
* 返回list
*/
public List<Contact> getContactList(){
return list;
}
/**
* 开始标签时读取
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
eleName = qName;
//开始一个contact标签就创建一个Contact对象
if("contact".equals(qName)){
contact = new Contact();
String id = attributes.getValue("id");//获取属性名为id的属性值
contact.setId(id);
}
// //遍历属性名为id的值
// for(int i=0; i<attributes.getLength(); i++){
// if("id".equals(attributes.getQName(i))){
// String id = attributes.getValue(i);
// break;
// }
// }
}
/**
* 读取文本时调用
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//获取当前文本内容
data = new String(ch, start, length);
/**
* 方式1:解决获取文本内容为空 正则表达式存在一些问题 推荐使用方式2
*/
/* data = data.trim();//去掉字符串两边空格;
//正则:非空白字符,一次或者多次匹配
String reg = "\\S+";
for(int i=0; i<ch.length; i++){
if(data.matches(reg)){//如果读取到的文本中有非空白字符,则说明文本有内容
*/
if("name".equals(eleName)){
contact.setName(data);
}else if("age".equals(eleName)){
contact.setAge(data);
}else if("phone".equals(eleName)){
contact.setPhone(data);
}else if("email".equals(eleName)){
contact.setEmail(data);
}else if("qq".equals(eleName)){
contact.setQq(data);
}
}
/*}
}*/
/**
* 结束标签时读取
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
/**
* 方式2:解决获取文本内容为空
*/
//当标签结束时,立即置空eleName,为了避免空格和换行设置到对象的属性中
eleName = null;
if("contact".equals(qName)){
//结束一个contact标签就将Contact对象添加到ContactList集合中
list.add(contact);
}
}
}
Contact.java:
package com.sax;
public class Contact {
private String id;
private String name;
private String age;
private String phone;
private String email;
private String qq;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "Contact [id=" + id + ", name=" + name + ", age=" + age
+ ", phone=" + phone + ", email=" + email + ", qq=" + qq + "]";
}
}
contact4.xml:
<?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001">
<name>木丁西</name>
<age>18</age>
<phone> 18071897425</phone>
<email> 10124 21396@qq.com</email>
<qq>1012421396</qq>
</contact>
<contact id="002">
<name>小刘</name>
<age>20</age>
<phone>18771897466</phone>
<email>561242139@qq.com</email>
<qq>561242139</qq>
</contact>
</contactList>
效果: