文档章节

Java XML && SAX && StAX && JAXP

秋风醉了
 秋风醉了
发布于 2014/07/01 13:24
字数 1662
阅读 607
收藏 9

XmlPull project

XmlPull project is dedicated(专用) to be a site for

  • for general Pull parsing promotion(提升)/education (including StAX) and in particular to contain easy-to-reuse samples and code fragments

  • a resource for discussing new ideas and concepts related to pull parsing

  • a java namespace (org.xmlpull.*) and project location of a free implementation of the event object API and Factories, based on the StAX XMLStreamReade and old Common API for XML Pull Parsing

  • as java namespace and project location of StAX and XmlPull based utilities and samples such as:

    - providing an XML stream from a DOM tree

    - a DOM builder

    - SAX adapter

    - JUnit tests

  • as a maintenance resource for the existing XmlPull interface

 

About kXML

kXML is a small XML pull parser, specially designed for constrained environments such as Applets, Personal Java or MIDP devices. In contrast to kXML 1, kXML 2 is based on the common XML pull API.

 

About SAX

SAX is the Simple API for XML, originally a Java-only API. SAX was the first widely adopted API for XML in Java, and is a “defacto” standard. The current version is SAX 2.0.1, and there are versions for several programming language environments other than Java.

The SAX2 core includes the org.xml.sax and org.xml.sax.helpers packages, but that's not all there is to SAX. The org.xml.sax.ext package includes standardized extensions, and anyone can define and implement nonstandard ones using the SAX2 core "feature flags" and "property objects" mechanisms(机制机能).

SAX 是事件驱动的 XML 处理方法。它由许多回调组成。例如,startElement() 回调在每次 SAX 解析器遇到元素的起始标记时被调用。characters() 回调为字符数据所调用,然后 endElement() 为元素的结束标记所调用。许多回调用于文档处理、错误和其他词汇结构。您明白了。SAX 程序员实现一个 SAX 接口来定义这些回调。SAX 还提供一个叫做 DefaultHandler 的类(在 org.xml.sax.helpers 软件包中)来实现所有这些回调,并提供所有回调方法默认的空实现。

 

Java使用sax方式解析xml

package xml;

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

/**
 * Created with IntelliJ IDEA.
 * User: ASUS
 * Date: 14-7-1
 * Time: 下午4:30
 * To change this template use File | Settings | File Templates.
 */
public class SaxHandler extends DefaultHandler {
    @Override
    public void startDocument() throws SAXException {
        System.out.println("========start parse document========");
    }

    @Override
    public void endDocument() throws SAXException {

        System.out.println("========end parse document========");
    }


    /**
     * @param uri        命名空间
     * @param localName  包含名称空间的标签
     * @param qName      不包含名称空间的标签
     * @param attributes 属性的结合
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("========start parse element========");
        System.out.println("localName=" + localName);
        System.out.println("qName=" + qName);
        if (attributes != null) {
            for (int i = 0; i < attributes.getLength(); i++) {
                System.out.println(attributes.getQName(i) + "=\"" + attributes.getValue(i) + "\"");
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);    //To change body of overridden methods use File | Settings | File Templates.
    }

    @Override
    public void setDocumentLocator(Locator locator) {
        super.setDocumentLocator(locator);    //To change body of overridden methods use File | Settings | File Templates.
    }

    @Override
    public void startPrefixMapping(String prefix, String uri) throws SAXException {
        super.startPrefixMapping(prefix, uri);    //To change body of overridden methods use File | Settings | File Templates.
    }

    @Override
    public void endPrefixMapping(String prefix) throws SAXException {
        super.endPrefixMapping(prefix);    //To change body of overridden methods use File | Settings | File Templates.
    }


    /**
     * @param ch     回传的字符数组
     * @param start  字符数组的开始位置
     * @param length 字符数组的结束位置
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.println("start=" + start + ",length=" + length + ",length of ch=" + ch.length);
        String content = new String(ch, start, length);
        System.out.println("content = " + content.toString()); //只做简单的打印处理
    }
}

 

package xml;

import org.junit.Test;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;

public class HelloTest {
    @Test
    public void test00() throws ParserConfigurationException, SAXException, IOException {

        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n" +
                "<books> \n" +
                "   <book id=\"001\" isbn=\"1998\"> \n" +
                "      <title>Harry Potter</title> \n" +
                "      <author>J K. Rowling</author> \n" +
                "   </book> \n" +
                "   <book id=\"002\" isbn=\"1998\"> \n" +
                "      <title>Learning XML</title> \n" +
                "      <author>Erik T. Ray</author> \n" +
                "   </book> \n" +
                "</books> ";

        SAXParserFactory factory = SAXParserFactory.newInstance();
        //创建解析器
        SAXParser parser = factory.newSAXParser();

        ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());
        parser.parse(in, new SaxHandler());
    }
}

 

The Streaming API for XML (StAX)

StAX is a standard XML processing API that allows you to stream XML data from and to your application. This StAX implementation is the standard pull parser implementation for JSR-173 specification.

Features of StAX API:

  • The standard pull parser interface (included in JDK 1.6, downloadable separately for 1.4, 1.5)

  • Reader and Writer APIs: both with two levels, "raw" cursor access and object-based "event" access

  • Efficient XML access (especially using cursor API)

  • Gives application control over parsing: "reverse Hollywood": you can call us, instead of waiting us to call you

 

Java使用StAX解析xml

package xml;

import org.junit.Test;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;

public class HelloTest {

    @Test
    public void test898() throws XMLStreamException {

        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n" +
                "<books> \n" +
                "   <book id=\"001\" isbn=\"1998\"> \n" +
                "      <title>Harry Potter</title> \n" +
                "      <author>J K. Rowling</author> \n" +
                "   </book> \n" +
                "   <book id=\"002\" isbn=\"1998\"> \n" +
                "      <title>Learning XML</title> \n" +
                "      <author>Erik T. Ray</author> \n" +
                "   </book> \n" +
                "</books> ";


        XMLInputFactory factory = XMLInputFactory.newInstance();
        factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
        ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());
        XMLStreamReader reader = factory.createXMLStreamReader(in);

        int event = reader.getEventType();
        System.out.println("event=" + event);

        while (true) {
            switch (event) {
                case XMLStreamConstants.START_DOCUMENT:
                    System.out.println("Start Document.");
                    break;
                case XMLStreamConstants.START_ELEMENT:
                    System.out.println("Start Element: " + reader.getName());
                    for (int i = 0, n = reader.getAttributeCount(); i < n; ++i)
                        System.out.println("Attribute: " + reader.getAttributeName(i)
                                + "=" + reader.getAttributeValue(i));

                    break;
                case XMLStreamConstants.CHARACTERS:
                    if (reader.isWhiteSpace())
                        break;

                    System.out.println("Text: " + reader.getText());
                    break;

                case XMLStreamConstants.END_ELEMENT:
                    System.out.println("End Element:" + reader.getName());
                    break;

                case XMLStreamConstants.END_DOCUMENT:
                    System.out.println("End Document.");
                    break;
            }

            if (!reader.hasNext()) {
                break;
            }
            event = reader.next();
        }
    }

}

 

XML Parsing Models

  • Object (DOM, JDOM etc.)---Tree Model, DOM

  • Push (SAX)---Push Model, SAX

  • Pull (StAX)---Pull Model, StAX

Object (DOM, JDOM etc.)---Tree Model, DOM

Push (SAX)---Push Model, SAX

Pull Model, StAX

StAX Pull Model Twoapproach..

1. Cursor APIs----XMLStreamReader

2. Event APIs-----XMLEventReader

StAX Events

1) Namespace

2) StartDocument

3) EndDocument

4) StartEl ement

5) EndEl ement

6) Attri bute

7) Enti tyDecl arati on

8) Enti tyReference

9) Notati on

10)PI

11)DTD

12)Characters

13)Comment

 

The Java API for XML Processing (JAXP) 

The Java API for XML Processing (JAXP) enables applications to parse, transform, validate and query XML documents using an API that is independent(独立地) of a particular XML processor implementation. JAXP provides a pluggability layer to enable vendors(供应商) to provide their own implementations without introducing dependencies in application code.  Using this software, application and tool developers can build fully-functional XML-enabled Java applications for e-commerce, application integration(积分), and web publishing.

JAXP is a standard component(标准组件) in the Java platform. An implementation of the JAXP 1.4 is included in Java SE 6.0 and OpenJDK7, JAXP 1.5 in OpenJDK7 update 40 as well as in Java SE 8.0, and JAXP 1.6 is now in Java SE 8.0. JAXP 1.4 is a maintenance release of JAXP 1.3 with support for the Streaming API for XML (StAX), JAXP 1.5 is a maintenance release of JAXP 1.4 with new security related properties, and JAXP 1.6 is part of prepare for modularization.

JAXP全称Java API for XML Processing,最开始的时候(JAXP1.0)是叫Java API for XML Parsing,因为那个时候JAXP还仅支持XML的解析,后来JAXP不断进化,其支持的内容不断增加,也就改名为Processing了。

JAXP利用标准解析器Simple API for XML Parsing (SAX) 和 Document Object Model (DOM) 使我们可以在将数据作为事件流来解析或者构建出文档对象模型来解析中作出选择;JAXP 支持 Extensible Stylesheet Language Transformations (XSLT) 标准, 使我们能够将数据转换成其他的XML文档或其他格式,如HTML;从JAXP1.4版本开始,Streaming API for XML (StAX,JSR-173) 被加入到JAXP家庭中来。

 

相关API总览

  • javax.xml.parsers: JAXP相关API,为不同SAX and DOM 解析提供商提供通用接口

  • org.w3c.dom: 文档对象模型(DOM)相关的接口

  • org.xml.sax: 定义基本的SAX相关API

  • javax.xml.transform:定义了XSLT相关 API,使我们可以将XML转换成其它形式

  • javax.xml.stream:提供StAX相关的 API

 

JAXP各相关API特征对比

特征

StAX

SAX

DOM

TrAX

API Type

Pull, streaming

Push, streaming

In memory tree

XSLT Rule

Ease of Use

High

Medium

High

Medium

XPath Capability

No

No

Yes

Yes

CPU and Memory Efficiency

Good

Good

Varies

Varies

Forward Only

Yes

Yes

No

No

Read XML

Yes

Yes

Yes

Yes

Write XML

Yes

No

Yes

Yes

Create, Read, Update, Delete

No

No

Yes

No

可以更新JAXP的语法分析器

=============END=============

© 著作权归作者所有

秋风醉了
粉丝 250
博文 532
码字总数 405586
作品 0
朝阳
程序员
私信 提问
完整理解XML领域(耗费心血,欢迎纠错)

每个人都知道什么是XML,也知道它的格式.如果深入点理解如何使用XML,可能就不是每个人都知道的了. XML是一种自描述性文档,它的作用是内容的承载,和展示没有任何关系.所以,如何将XML里的数据以...

xpbug
2013/01/24
0
11
Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerce...

长平狐
2013/01/06
159
0
4个Java的常用工具,了解一下吧!

在现如今的互联网时代里,Java无疑是一种极为流行的开发语言,无论是程序界还是整个互联网行业势必带来很大的影响。不管是人才需求还是薪资水平上,Java的发展前景都是很乐观的。 关于Java的...

梦想远方_8e96
2018/06/15
0
0
关于 Java 常用工具您不知道的 5 件事

1. StAX 在千禧年左右,当 XML 第一次出现在很多 Java 开发人员面前时,有两种基本的解析 XML 文件的方法。SAX 解析器实际是由程序员对事件调用一系列回调方法的大型状态机。DOM 解析器将整个...

鉴客
2010/10/21
840
5
Exception in thread "main" org.xmlpull.v1.XmlPullP

[xmlpull]XmlPull常见错误 编写者 日期 关键词 郑昀@ultrapower 2005-9-28 Xmlpull kxml java Xmlpull官方站点:http://www.xmlpull.org/ 优点:不必等整个文档解析完成,部分求值结果早就可...

Java编程思想
2014/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端知识点总结——HTML

前端知识点总结——HTML HTML:HTML4.01 指的就是网页技术 HTML5:HTML4.01的升级版本 1.web的基础知识 web与Internet 1.Internet:全球性的计算机互联网络,因特网,互联网,交互网 2.提供服...

智云编程
43分钟前
0
0
微服务之架构技术选型与设计

本文主要介绍了架构技术选型与设计-微服务选型,Spring cloud 实现采用的技术,希望对您的学习有所帮助。 架构技术选型与设计-DUBBODubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿...

别打我会飞
今天
3
0
在Windows中运行Linux bash命令的几种方法

如果你正在课程中正在学习 shell 脚本,那么需要使用 Linux 命令来练习命令和脚本。 你的学校实验室可能安装了 Linux,但是你自己没有安装了 Linux 的笔记本电脑,而是像其他人一样的 Window...

老孟的Linux私房菜
今天
10
0
深入理解计算机系统(1.1)------Hello World 是如何运行的

上一篇序章我谈了谈 程序员为啥要懂底层计算机结构 ,有人赞同也有人反对,但是这并不影响 LZ 对深入理解计算机系统研究的热情。这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程...

vinci321
今天
3
0
Linux操作系统之Shell程序设计

Linux操作系统之Shell程序设计 Shell是种命令解释程序,也可以看作是一种命令语言的解释器。 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行...

linuxCool
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部