XML解析方式小谈

本文介绍了DOM和SAX两种XML解析方式的工作原理及其应用场景。DOM解析器将XML文档加载到内存并构建Document对象树,便于操作和修改;SAX解析器采用事件驱动模型,适合处理大型文件和数据抽取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DOM解析:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

        //创建需要解析的xml文档对象
        File xmlfile=new File("src/com/hts/dom/xml/Dom.xml");
        //声明DocumentBuilder对象,抽象类,不能实例化
        DocumentBuilder builder=null;
        //通过单例模式创建DocumentBuilderFactory对象
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        try {
            //实例化builder
            builder=builderFactory.newDocumentBuilder();
            //解析xml文档
            Document document=builder.parse(xmlfile);
            //获取根节点对象
            Element element=document.getDocumentElement();
            System.out.println("根元素:"+element.getNodeName());
            //获得根节点下的子节点
            NodeList nodeList=element.getChildNodes();  
            //遍历
            for (int i = 0; i < nodeList.getLength(); i++) {
                //获取每一个节点
                Node node=nodeList.item(i);
                if("page-one".equals(node.getNodeName())){
                    //打印元素属性
                    System.out.println(node.getAttributes().getNamedItem("test").getNodeValue());
                    //输出节点内容
                    System.out.println(node.getTextContent());
                }
            /* */
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

步骤

  • 创建Document对象
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();//获取factory
DocumentBuilder builder=builderFactory.newDocumentBuilder();//获取bulider对象
Document document=builder.parse(xmlfile);//创建xml对象
  • 使用Document中的方法对xml内容进行处理,下面列举几种常用方法
方法描述
Element getDocumentElement(String data)返回该XML文档根元素
Elmement createElement(String tagName)创建一个元素
Text createTextNode(String data)创建一个文本节点
String getXmlVersion()放回XML的版本号
Attr createAttribute(String name)已参数名称创建一个属性

SAX解析:基于事件响应模型进行解析XML,解析时,触发一系列事件。(不能修改数据)

// 创建需要解析的xml文档对象
        File xmlfile = new File("src/com/hts/dom/xml/Dom.xml");
        //用单例模式创建SAXParserFactory对象
        SAXParserFactory parserFactory=SAXParserFactory.newInstance();
        try {
            //创建SAXParser对象
            SAXParser parser=parserFactory.newSAXParser();
            //解析文件,定义解析时的事件处理
            parser.parse(xmlfile,new SaxHandler());
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

步骤

  • 解析XML文件
SAXParserFactory parserFactory=SAXParserFactory.newInstance();//获取factory
SAXParser parser=parserFactory.newSAXParser();//获取parser
parser.parse(xmlfile,new SaxHandler());//开始解析
  • SAX解析是事件驱动型的,还需要些一个事件的监听器对象
package com.hts.sax.xml;

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

public class SaxHandler extends DefaultHandler {

    private String content;

    /*
     *事件发生时元素中的字符 
     * */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        content = new String(ch, start, length);
    }
    //解析到元素的结束标签触发
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("page-one".equals(qName)) {
            System.out.println(content);
        }
    }
    //解析到元素的开始标签时触发
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        if ("page-one".equals(qName)) {
            System.out.println(attributes.getValue("test"));
        }
    }
}

DOM和SAX解析方式的优劣

DOM将数据存储在内存中,而SAX不存储数据。

  • 如果必须对数据进行更改,并且作为 XML 将它输出,则在大多数情况下,使用 DOM。
  • 对于大文件,SAX 是更好的选择。
  • 如果实际上只使用一小部分数据,则使用 SAX 将数据抽取到应用程序中,这种方法更好些。
  • 通常,SAX 实现比 DOM 实现快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值