XML解析之SAX解析:如何将XML信息存储到集合中

xml源文件

<?xml version="1.0" encoding="utf-8"?>
<contact-list>
    <contact id="001" hobby="eat">
        <name>张三</name>
        <gender>男</gender>
        <age>22</age>
        <phone>17728394033</phone>
        <email>[email protected]</email>
        <address>130号</address>
    </contact>
    <contact id="002" hobby="drink">
        <name>李四</name>
        <gender>女</gender>
        <age>23</age>
        <phone>13721102938</phone>
        <email>[email protected]</email>
        <address>131号</address>
    </contact>

SAX解析的主程序

package hf.firstclass.b_SAX;
import java.io.File;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
 * 要想看懂这部分,先要看我的上一篇文章
 * @author LZK
 *
 */

public class TestSAX2 {
    public static void main(String[] args) throws Exception {
        //创建SAX解析器
        SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
        //创建一个处理器(自己创建)
        MyDefaultHandler3 handler= new MyDefaultHandler3();
        //解析XML文件
        parser.parse(new File("./src/contact.xml"), handler);
        //获取处理器提供的方法,获取集合信息
        List<Contact> list=handler.getContactList();
        for(Contact con:list){
            System.out.println(con);
        }
    }
}

SAX处理器(关键步骤)

package hf.firstclass.b_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;
/**
 * 思路:
 * 1,建立一个集合
 * 2,创建一个对象(弄清对象创建的时机)
 * 3,设置对象信息(关键一步,也是比较难理解的,如何关联标签与标签的文本)
 * 4,将对象放入到集合中(弄清存放到集合的时机)
 * @author Administrator
 *
 */
public class MyDefaultHandler3 extends DefaultHandler{
    //定义一个集合,用于存储联系人对象
    private List<Contact> conList= new ArrayList<Contact>();
    private Contact con;
    /*
     * 定义一个变量用于记录标签的名字
     * 以便关联标签与标签的文本内容
     */
    private String Tag;
    @Override
    public void startElement(String uri, String localName,
            String qName, Attributes attributes) throws SAXException {
        Tag=qName;
        if("contact".equals(qName)){
             con = new Contact();
            String idValue=attributes.getValue("id");
            con.setId(idValue);
        }
    }

    @Override
    public void endElement(String uri, 
            String localName, String qName) throws SAXException {
        //结束时 ,将标记置为空,防止给Contact内的值重复赋值。
        Tag=null;
        //当读到contact结束标签时,说明一个联系人读完了,存到集合中
        if("contact".equals(qName)){
            conList.add(con);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) 
            throws SAXException {
        //获取文本内容
        String content=new String(ch,start,length);
        if("name".equals(Tag)){
            con.setName(content);
        }else if("gender".equals(Tag)){
            con.setGender(content);
        }else if("age".equals(Tag)){
            con.setAge(content);
        }else if("phone".equals(Tag)){
            con.setPhone(content);
        }else if("email".equals(Tag)){
            con.setEmail(content);
        }else if("address".equals(Tag)){
            con.setAddress(content);
        }

    }
    public  List<Contact> getContactList(){
        return conList;
    }

}

设计联系人的类

package hf.firstclass.b_SAX;
/**
 * 定义一个联系人的类
 * 用于存储联系人全部信息
 * @author Administrator
 *
 */
public class Contact {
    private String id;
    private String name;
    private String gender;
    private String age;
    private String phone;
    private String email;
    private String address;
    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 getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    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 getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Contact [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", phone=" + phone
                + ", email=" + email + ", address=" + address + "]";
    }


}
发布了48 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_36599216/article/details/53456836