XML解析方式小谈

来源:互联网 发布:金蝶erp软件介绍 编辑:程序博客网 时间:2024/06/05 11:21

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();//获取factoryDocumentBuilder 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();//获取factorySAXParser parser=parserFactory.newSAXParser();//获取parserparser.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 实现快。
0 0
原创粉丝点击