XML解析(SAX解析和DOM解析)

来源:互联网 发布:产品报价系统源码 编辑:程序博客网 时间:2024/04/29 07:17

XML解析的两种方式

本文整理了XML解析的两种方式,分别是SAX解析和DOM解析

一、SAX解析

SAX解析是按照XML的标签顺序一步步的解析,首先加载document,然后按照顺序加载Element,在加载时我们可以设置监听事件,当加载document或者element时执行某些操作,直接上代码。

这里采用eclipse开发,XML文件放在project根目录下。
book.xml<?xml version="1.0" encoding="UTF-8"?><书架>    <书>        <书名>Java编程思想</书名>        <作者>张孝祥</作者>        <售价>98.8</售价>    </书>    <书>        <书名>HTML5+CSS</书名>        <作者>张孝祥</作者>        <售价>108.8</售价>    </书></书架>
SaxDemo.javapublic class SaxDome {    public static void main(String[] args) throws Exception {        //加载解析工厂        SAXParserFactory factory = SAXParserFactory.newInstance();        //通过工厂获取SAX解析器        SAXParser sax = factory.newSAXParser();        //获取读取器        XMLReader reader = sax.getXMLReader();        //注册事件处理器        reader.setContentHandler(new MyContentHandler());        //解析XML        reader.parse("country.xml");    }}
class MyContentHandler extends DefaultHandler {    @Override    public void startDocument() throws SAXException {        // TODO Auto-generated method stub        System.out.println("文档开始");    }    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {        // TODO Auto-generated method stub        System.out.println(qName + "标签开始");    }    @Override    public void characters(char[] ch, int start, int length) throws SAXException {        // TODO Auto-generated method stub        System.out.println(new String(ch,start,length));    }    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {        // TODO Auto-generated method stub        System.out.println(qName + "标签结束");    }    @Override    public void endDocument() throws SAXException {        // TODO Auto-generated method stub        System.out.println("文档结束");    }}

1、优点:不需要等待整个XML加载到内存,当解析到某一部分时自动触发对应的方法去处理,效率比较高。理论上不论多大的XML文件都可以解读。
2、缺点:每次将诶西都只能处理一次,下次解析还要重新解析。

二、DOM解析

Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。
只接上代码,需要的朋友可以直接拷贝

查询:@Test    public void query() throws Exception{        SAXReader reader = new SAXReader();        Document dom = reader.read("country.xml");        Element root = dom.getRootElement();        List<Element> list = root.elements();        Element book2 = list.get(1);        String book2Name = book2.element("书名").getText();        System.out.println(book2Name);    }
增加:@Test    public void add() throws Exception{        SAXReader reader = new SAXReader();        Document dom = reader.read("country.xml");        Element root = dom.getRootElement();        Element book = root.element("书");        Element price = DocumentHelper.createElement("特价");        price.setText("48");        book.add(price);        XMLWriter writer = new XMLWriter(new FileOutputStream("country.xml"), OutputFormat.createPrettyPrint());        writer.write(dom);        writer.close();    }
修改:@Test    public void update() throws Exception{        SAXReader reader = new SAXReader();        Document dom = reader.read("country.xml");        Element root = dom.getRootElement();        Element price = root.element("书").element("特价");        price.setText("4.0元");        XMLWriter writer = new XMLWriter(new FileOutputStream("country.xml"), OutputFormat.createPrettyPrint());        writer.write(dom);        writer.close();    }
删除:@Test    public void remove() throws Exception{        SAXReader reader = new SAXReader();        Document dom = reader.read("country.xml");        Element root = dom.getRootElement();        Element price = root.element("书").element("特价");        price.getParent().remove(price);        XMLWriter writer = new XMLWriter(new FileOutputStream("country.xml"), OutputFormat.createPrettyPrint());        writer.write(dom);        writer.close();    }
1 0
原创粉丝点击