Java对Xml文件解析

JAVA 解析 XML 通常有两种方式,DOM 和 SAX。

     DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构。但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的。
    SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方
法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API 在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会 被抛弃。

1. Xml技术简介
Xml文件有两种约束类型,包括文档类型定义(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的标准里。Xml 模式被包含在W3C的标准中。在xml 数据和xml 模式两者之间有很多的区别。
A. xml模式支持的数据类型比xml DTD多;
B. xml模式在无序的情况下使用起来比xml DTD更方便;
C. xml模式支持名字空间,可以在不同的文件中定义相同的方法等。
D. xml模式形成的文档可以被多种标准解析,如dom,sax或者jdom等,而xml DTD方式下确不行。
2. Xml文件解析
在java语言环境里可以使用三种方法解析xml文件:dom(document object model),sax(simple api for xml)和jdom(java document object model)。
SAX提供了基于事件的方式进行解析,适合于快速,数据量小的解析情况。SAX解析有几个缺陷:A.它的解析是连续的;B.数据无法回朔。
DOM解析不同于SAX。它提供了内存中完整的xml数据映像,数据被存储在树状结构中。DOM解析方式更容易获得和处理数据。
JDOM是java语言中特有的,主要用来支持xpath标准。
3. SAX解析方式
上面我简要介绍了几种解析xml文件的技术,这里我们使用SAX技术给出一个小例子,大家可以从这个例子中发现如果你能够掌握一些开源软件包,你就可以很快掌握解析xml数据的技术。
3.1制作一个简单的xml文件component.xml
<?xml version="1.0"?>
<XmlComponents>
<XmlComponent>
<ComNo>1</ComNo>
</XmlComponent>
</XmlComponents>


3.2下载xerces.jar软件包
在Apache网站上×××下载xerces.jar软件包,这个包中包含了上面我们列举的几种解析xml数据的API。然后将这个软件包加入到程序的 classpath中。
3.3制作解析类MySaxParser.java
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MySaxParser extends DefaultHandler {

    private static int INDENT = 2;

    // 运行主方法

    public static void main(String[] argv) {
        // if (argv.length != 1) {
        // System.out.println("Usage: java ds.MySaxParser [URI]");
        // System.exit(0);
        // }

        System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
        // String uri = argv[0];

        String uri = "Components.xml";
        try {
            SAXParserFactory parserFactory = SAXParserFactory.newInstance();
            parserFactory.setValidating(false);
            parserFactory.setNamespaceAware(false);
            MySaxParser MySaxParserInstance = new MySaxParser();
            SAXParser parser = parserFactory.newSAXParser();
            parser.parse(uri, MySaxParserInstance);
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
        catch (SAXException ex) {
            ex.printStackTrace();
        }
        catch (ParserConfigurationException ex) {
            ex.printStackTrace();
        }
        catch (FactoryConfigurationError ex) {
            ex.printStackTrace();
        }

    }

    private int idx = 0; // indent
    // 处理各种分隔符号
    public void characters(char[] ch, int start, int length) throws SAXException {
        // instantiates s, indents output, prints character values in element
        String s = new String(ch, start, length);
        if (!s.startsWith("\n")) // 空的value不打印
            System.out.println(getIndent() + " Value: " + s);
    }

    // 处理文档尾
    public void endDocument() throws SAXException {
        idx -= INDENT;
        System.out.println(getIndent() + "end document");
        System.out.println("...PARSING ends");

    }

    // 处理标记尾
    public void endElement(String uri, String localName, String qName) throws SAXException {
        idx -= INDENT;
    }

    // 处理文档的起始点
    public void startDocument() throws SAXException {
        idx += INDENT;
        System.out.println("PARSING begins...");
        System.out.println(getIndent() + "start document: ");
    }

    // 处理标记头
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        idx += INDENT;
        System.out.println('\n' + getIndent() + "start element: " + qName);
    }

    private String getIndent() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < idx; i++)
            sb.append(" ");
        return sb.toString();
    }

}

总结,虽然解析xml数据很复杂,因为涉及了很多的递归算法,但是我们可以使用业界比较成熟的解析API来进行xml数据处理。我现在只是给出了一个非常简单的例子,但是在真实系统中远比这个要复杂的多,大家以后在使用的使用会发现还是有很多的工作要做的。

 

你可能感兴趣的:(Java对Xml文件解析)