XML文件解析之--DOM与SAX

xml文件又称‘可扩展性标记语言’,可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。

我们在进行web开发的时候离不开xml文件,xml文件无处不在,这次就烂讨论一下xml常用的解析方法及其CRUD操作,欢迎大家交流指正。

我们先来看看两种解析方式的过程,比较一下他们的优劣之处。

SAX解析方式:它对xml文档进行逐行扫描,一边扫描一边解析。当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

DOM解析方式:DOM解析是W3C组织提供的标准,把所有内容一次性的装载入内存,并构建一个驻留在内存中的树状结构,然后根据节点之间的关系来解析XML。

性能分析:

1.SAX解析因为是逐行逐句扫描解析,比起DOM方式一次性装在所有内容到内存中来说,效率来说应该更高一些。

2.但是恰恰是SAX这种解析方式,注定使SAX解析不适合对XML文档进行增删改等操作。而DOM解析的增删改操作相比之下就十分方便。

3.因为DOM解析式一次性装在所有内容到内存中,所以如果用户只需要其中一部分内容,DOM解析的方式的效率就大打折扣。

综上分析:sax解析更适合做部分信息的读取操作,DOM解析更适合做XML文件的增删改操作。

接下来我们来看看它们的CRUD操作

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "theBook.dtd">
<books>
    <book>
        <id>01</id>
        <name>鲁滨逊漂流记</name>
        <price>33</price>
    </book>
    <book>
        <id>02</id>
        <name>钢铁是怎样炼成的</name>
        <price>30</price>
    </book>
</books> 

对应的Bean类

public class Book {
    private String id;
    private String name;
    private String price;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }

}

1.SAX解析:

流程:

1.获取工厂实例;

2.得到解析器;

3.得到读取器;

4.设置内容处理器;(SAX解析方式给我们提供了不同的处理器接口以及父类,我们可以选择继承其中的父类或者实现接口进行内容处理)

在进行内容处理时,SAX提供了多种不同的方法,分别在文档的开始和结尾,元素的开始和结尾等有事件,我们需要在相应的地方重写这些事件完成功能。

5.最后我们将相应的对象模型设置属性,将其存入list中,返回list。

解析实例:

public void saxFactory() throws ParserConfigurationException, SAXException, IOException{
        //获得工厂实例
        SAXParserFactory ft = SAXParserFactory.newInstance();
        //得到解析器
        SAXParser sp = ft.newSAXParser();
        //得到读取器
        XMLReader reader = sp.getXMLReader();
        //设置内容处理器
        BeanListHandler handler = new BeanListHandler();

        reader.setContentHandler(handler);

        reader.parse("src/Book.xml");

        List <Book> list = handler.getList();
}

BeanListHandler类

class BeanListHandler extends DefaultHandler{
     private List list = new ArrayList();
     private String currentTag;
     private Book book;
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if("name".equals(currentTag)){
            String name = new String(ch,start,length);
            book.setName(name);
        }
        if("id".equals(currentTag)){
            String id = new String(ch,start,length);
            book.setId(id);
        }
        if("price".equals(currentTag)){
            String price = new String(ch,start,length);
            book.setPrice(price);
        }
        super.characters(ch, start, length);
    }
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if(qName.equals("book")){
            list.add(book);
            book = null;
        }
        currentTag = null;
        super.endElement(uri, localName, qName);
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        currentTag = qName;
        if("book".equals(currentTag)){
            book = new Book();
        }
        super.startElement(uri, localName, qName, attributes);
    }
    public List getList() {
        return list;
    }
}

SAX解析:相对使用起来复杂一些,主要是实现步骤顺序,以及相对应事件中填入实现功能代码。

2.DOM解析:

DOM解析的实现代码相对于前者就简单易懂些

DOM解析中有多种解析工具,此处以DOM4j为例

主要步骤:

1.获得读取器

2.获得document对象

3.对相应的节点对象进行操作

读取操作(获取某个节点的值):

public void read() throws DocumentException{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/Book.xml"));

        Element root = document.getRootElement();
        Element book = (Element)root.elements("book").get(1);
        System.out.println(book.element("name").getText());
    }

增加操作:

public void add() throws DocumentException, IOException{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/Book.xml"));

        Element book = document.getRootElement().element("book");
        book.addElement("author").setText("abc");

        //格式化输出器
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter writer = new XMLWriter(new FileOutputStream("src/Book.xml"),format);

        writer.write(document);
        writer.close();
    }

删除操作:

public void delete() throws DocumentException, IOException{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/Book.xml"));

        Element root = document.getRootElement();
        Element name = root.element("book").element("name");

        name.getParent().remove(name);

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/Book.xml"),format);
        writer.write(document);
        writer.close();
    }

修改操作:

public void update() throws DocumentException, IOException{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/Book.xml"));

        Element root = document.getRootElement();
        Element book = (Element) root.elements("book").get(1);
        book.element("name").setText("西游记");

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/Book.xml"),format);
        writer.write(document);
        writer.close();
    }

!!此处需要注意:也许大家注意到了增删改后面有五行代码是一样的。没错!因为需要对xml文件进行读写,所以也需要解决乱码问题,解决乱码问题有多种方法,此处只列举这一种方法,创建格式化输出器,规定其编码和xml中默认相同的编码,输出时选用字节流,配合格式化输出器中规定的编码,这样就不会产生中文乱码问题了。

时间: 2024-08-05 15:19:42

XML文件解析之--DOM与SAX的相关文章

XML文件解析-DOM4J方式和SAX方式

最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml内容保存在blob字段中,然后jdbc读取blob字段获取xml内容进行解析. 解析的方法挺简单的,网上有很多种,主要有SAX,DOM4J等. 先来揭晓一下DOM4J是如何解析xml文件的,话不多少,直接上码. /** * 获取xml文件绝对路径 */ private String getFileP

XML文件解析之DOM解析

XML文件是一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.基本的解析方式包括DOM解析和SAX解析,具体来说包括DOM解析,SAX解析,DOM4J解析以及JDOM解析,首先来讲下DOM解析的具体实现方式: 1.重要的对象 DocumentBuilderFactory: 创建文档解析器的工厂对象 DocumentBuilder :得到文档解析器对象,由工长对象获取 Document :文档对象 2.解析XML实现方式 XML文件: <?xml v

【Android进阶】解析XML文件之使用DOM解析器

在前面的文章中,介绍了使用SAX解析器对XML文件进行解析,SAX解析器的优点就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析.DOM解析器的优点可能是理解起来比较的直观,当然,每个人对不同的解析方法可能有不同的喜好.但是DOM解析器有个比较大的缺点,就是占用内存比较多,在Android中的XML解析中,还是更推荐其他的解析方式. 下面介绍使用DOM解析器对XML进行解析. 下面是我们需要解析的xml文件 <?xml version="1.0" encodin

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

android之XML文件解析 -- SAX

xml文件解析之SAX 下面的实例代码主要采用的是SAX事件驱动处理机制来解析XML文件,SAX解析XML是通过逐行扫描的方式完成的,占用内存小.dom机制是将文件全部读出,然后再以树结构的形式,来完成查找.删除等操作,对内存占用较大 MyContentHandler.java     此文件是事件处理器实现 package com.example.analysisxml; import org.xml.sax.Attributes; import org.xml.sax.SAXExceptio

XML文件解析之JDOM解析

1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道.JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档.JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

JAVA之XML文件解析

在Java.Android开发中,xml文件的解析很重要.本人使用过的xml文件解析的方式有两种,一种是DOM文档解析.还有一种是SAX. DOM是基于文档树结构的.SAX是基于事件驱动的.SAX则是遇到标签则触发工作的.当解析器发现元素开始.元素结束.文本.文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据.优缺点很明显:DOM对于大型文件的操作不好(因为它要先读入整个文档到内存中),SAX为了解决这样问题.不用事先调入整个文档,占用资源少:SAX解析器代码比DOM解析器代