利用JAXP和DOM4J解析XML

前言

原创文章欢迎转载,请保留出处。
若有任何疑问建议,欢迎回复。
邮箱:Maxwell_nc@163.com

解析XML主要有两种思想,一种是SAX(Simple API for XML),另一种是DOM(文档对象模型),其中在J2EE中,提供了JAXP来实现这两种解析,本文主要利用JAXP实现SAX解析,同时介绍时下流行的DOM4J实现DOM解析。


SAX解析和DOM解析比较

  • SAX解析
    • 优点:效率高,当遇到大的XML文件时,不需要扫描完文件就可以操作。
    • 缺点:不能进行RUD操作,每次操作都要重新解析
  • DOM解析
    • 优点:只需要解析一次XML
    • 缺点:解析完成才能操作,遇到大的XML文件时耗内存。

JAXP实现SAX解析

首先要有一个xml文件

<?xml version="1.0" encoding="UTF-8"?>
<测试><作者>maxwell_nc</作者><博客>http://blog.youkuaiyun.com/maxwell_nc</博客></测试>

引用一张经典图来说明SAX解析
sax

接下来写代码:

package maxwell;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class SaxPaserDemo {

    public static void main(String[] args) throws Exception {
        //获取SAX解析器工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //通过工厂获取SAX解析器
        SAXParser parser = factory.newSAXParser();
        //获取XML阅读器
        XMLReader reader = parser.getXMLReader();
        //关联事件解析器
        reader.setContentHandler(new MyContentHandler());
        //解析XML文件
        reader.parse("src/maxwell/demo.xml");
    }

}

/*DefaultHandler是ContentHandler接口适配器*/
class MyContentHandler extends DefaultHandler{
    @Override
    public void startDocument() throws SAXException {
        // 扫描到xml文档开始
        System.out.println("xml解析开始");
    }

    @Override
    public void endDocument() throws SAXException {
        // 扫描到xml文档结束
        System.out.println("xml解析结束");
    }

    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        // 发现开始标签,打印标签名
        System.out.println("<"+name+">");
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // 打印标签体
        System.out.println(new String(ch, start, length));
    }
}

利用DOM4J实现DOM解析

SAX解析最大缺点就是不能RUD,而DOM可以,无奈本身JAXP的性能低下,所以现在流行使用DOM4J解析XML。
利用DOM4J来解析XML,代码实现上更加简单简洁。

package maxwell;

import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


public class Dom4jDemo {

    public static void main(String[] args) throws Exception {
        //利用dom4j获取XML阅读器
        SAXReader reader = new SAXReader();
        //获取document对象
        Document document = reader.read("src/maxwell/demo.xml");
        //获取根节点对象
        Element root = document.getRootElement();

        //打印标签体
        System.out.println(root.element("作者").getText());
        System.out.println(root.element("博客").getText());

        //添加节点并添加属性,设置标签体
        Element newEle = DocumentHelper.createElement("添加节点");
        newEle.addAttribute("测试", "test");
        newEle.setText("测试dom4j的添加节点功能");
        root.add(newEle);

        //写回文件
        XMLWriter writer  = new XMLWriter(new FileOutputStream("src/maxwell/demo.xml"),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    }


}

而且带有美化输出的功能,修改后:
修改XML输出


总结

实际上无论JAXP还是DOM4J都支持DOM和SAX解析,但DOM4J操作都非常简单,而且性能要比JAXP强大,但要注意,要使用DOM4J必须导入jar文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值