XMl解析之—DOM解析与SAX解析

本文介绍XML的基本概念,并通过实例展示了Java中使用DOM和SAX两种方法解析XML文档的过程。这两种方法各有优缺点,DOM适用于需要随机访问XML文档的场景,而SAX则更适合于数据流式的处理方式。

什么是XML(Extensible Markup Language 可扩展标记语言),xml是一个以文本来描述数据的文档

JAVA解析XML通常是两种方式,DOM和SAX
DOM:Document Object Model(文档对象模型)
DOM的特性:
定义一组java接口,基于对象,与语言和平台无关将xml文档表示为树,在内存中解析和定义XML文档,允许随机
访问文档的不同部分
DOM解析XML
DOM的优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来比较方便
常用于服务器

SAX是Simple API for XML的缩写
SAX是读取和操作xml数据更快,更轻量的方法。SAX允许在读取文档时就处理它,从而不必等整个文档被存储之后才来采取操作
。它不涉及DOM所必须得开销和概念跳跃。
SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据
在其解析文档时发生一定事件的时候会通知开发者,当你对其相应时,不做保存的数据将会被抛弃
不占内存,灵活性差,顺序读取,速度快,适用于性能要求就高的设备上使用,如Android,不占内存

DOM解析示例:

public class DomParse {
    static Person p=new Person();
    //DOM解析XML
    public static void main(String[] args) {
        try {
            DomPaseXml();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
    }
    private static void DomPaseXml() throws ParserConfigurationException {
        try {
            //创建builder
            DocumentBuilderFactory builder=DocumentBuilderFactory.newInstance();
            DocumentBuilder db = builder.newDocumentBuilder();
            //解析路径
            InputStream is=Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("day0702XmlDemo/Demo.xml");
            Document doc = db.parse(is);
            //从解析器中获取数据
            //获取节点的列表
            NodeList nl = doc.getElementsByTagName("person");
            System.out.println(nl.getLength());
                for(int j=0;j<nl.getLength();j++){
                    Node per = nl.item(j);
                    System.out.println(per.getNodeName());;
                    p.setPerson(per.getAttributes().getNamedItem("id").getNodeValue());
                    System.out.println(p.getPerson());
                    NodeList perlist = per.getChildNodes();
                    for(int l=0;l<perlist.getLength();l++){
                        Node pernode = perlist.item(l);
                        String nodeName = pernode.getNodeName();
                        if("name".equals(nodeName)){
                            p.setName(pernode.getFirstChild().getNodeValue());
                        }else if(nodeName.equals("age")){
                            p.setAge(Integer.parseInt(pernode.getFirstChild().getNodeValue()));
                        }else if(nodeName.equals("sex")){
                            p.setSex(pernode.getFirstChild().getNodeValue());
                        }else if(nodeName.equals("tel")){
                            p.setTel(Integer.parseInt(pernode.getFirstChild().getNodeValue()));
                        }
                    }
                    System.out.println(p.toString());
                }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}

SAX解析示例:
SAX解析需要一个DefaultHandler

public class PersonHandler extends DefaultHandler{

    private List<Person> list;
    Person p;
    String tag;

    public List<Person> getList() {
        return list;
    }

    //开始解析文档
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.startDocument();
        list=new ArrayList<Person>();
        System.out.println("开始解析文档啦");
    }
    //结束解析文档
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
        System.out.println("文档解析完毕");
    }

    //开始标签
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if(qName.equals("person")){
            p=new Person();
            p.setPerson(attributes.getValue("id"));
        }
        tag=qName;
    }

    //结束标签
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        super.endElement(uri, localName, qName);
        if("person".equals(qName)){
            list.add(p);
        }
        tag=null;
    }

    //解析文档的(包括空格)
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);
        if(tag!=null){
            if("name".equals(tag)){
                p.setName(new String(ch,start,length));
            }else if("age".equals(tag)){
                p.setAge(Integer.parseInt(new String(ch,start,length)));
            }else if("sex".equals(tag)){
                p.setSex(new String(ch,start,length));
            }else if("tel".equals(tag)){
                p.setTel(Integer.parseInt(new String(ch,start,length)));
            }
        }
    }
}

然后是解析

public class SAXParse {
    private static List<Person> list;
    public static void main(String[] args) {
        List<Person> saXpaseXml = SAXpaseXml();
        for (Person person : saXpaseXml) {
            System.out.println(person.toString());
        }

    }
    private static List<Person> SAXpaseXml() {
        try {
            //创建解析器
            SAXParserFactory factory=SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            InputStream is=Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("day0702XmlDemo/Demo.xml");
            PersonHandler dh=new PersonHandler();
            saxParser.parse(is, dh);
            list = dh.getList();
        }  catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
}

定义一个需要解析的类对象

public class Person {
    String person;
    String name;
    int age;
    String sex;
    int tel;

    public String getPerson() {
        return person;
    }

    public void setPerson(String person) {
        this.person = person;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getTel() {
        return tel;
    }

    public void setTel(int tel) {
        this.tel = tel;
    }


    public Person() {
        super();
    }

    protected Person(String person, String name, int age, String sex, int tel) {
        super();
        this.person = person;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.tel = tel;
    }

    @Override
    public String toString() {
        return "Person [person=" + person + ", name=" + name + ", age=" + age
                + ", sex=" + sex + ", tel=" + tel + "]";
    }


}

xml文件

<?xml version="1.0" encoding="utf-8"?>
    <taiyuan>
        <person id="1">
            <name>小郭</name>
            <age>23</age>
            <sex></sex>
            <tel>110</tel>
        </person>
         <person id="2">
            <name>小王</name>
            <age>20</age>
            <sex></sex>
            <tel>112</tel>
        </person>

    </taiyuan>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值