`
zhf257
  • 浏览: 3828 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Java StAX解析XML

    博客分类:
  • SOA
阅读更多

1DOM提供了一个易于使用的API,与SAXStAX相比,它的优势在于支持XPath,不过,它也迫使将整个文档读入存储器中,这对于小文档来说没什么,但会影响大文档的性能,而对于非常大的文档来说,这是根本禁止的。

2SAX通过作为一种“推”机制的解析器来处理该方面,也就是说,对于该解析器在文档中遇到的每种结构,都会生成相应的事件,程序员可以选择自己感兴趣的事件进行处理,不足之处在于SAX通常生成的大量事件是程序员并不关系的。而且,SAX API不提供迭代文档处理,从头到尾摧毁整个事件。

 

3StAX方法解析XML

StAXStreaming API for XML,当前最有效的XML处理方法,因此特别适合于处理复杂流程,比如数据库绑定和SOAP消息。StAX创建的信息集是非常小,可以直接作为垃圾收集的候选对象。这让XML处理任务占用较小的空间,使得它不仅适用于小型堆设备,比如移动电话,而且适用于长期运行的服务器端应用程序。

SAX不同,StAX能够对XML文档进行写操作,这减少了需要处理的API数量。

StAX提供两种不同的解析数据模型:光标模型和迭代器模型。

Catalog.xml

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <book sku="123_xaa">
        <title>King Lear</title>
        <author>William Shakespeare</author>
        <price>6.95</price>
        <category>classics</category>
    </book>
    <book sku="988_yty">
        <title>Hamlet</title>
        <author>William Shakespeare</author>
        <price>5.95</price>
        <category>classics</category>
    </book>
    <book sku="434_asd">
        <title>1984</title>
        <author>George Orwell</author>
        <price>12.95</price>
        <category>classics</category>
    </book>
    <book sku="876_pep">
        <title>Java Generics and Collections</title>
        <authors>
            <author>Maurice Naftalin</author>
            <author>Phillip Wadler</author>
        </authors>
        <price>34.99</price>
        <category>programming</category>
    </book>
</catalog>

 使用StAX光标模型:XMLStreamReader

import static java.lang.System.out;
import java.io.InputStream;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
/**
 * StAX光标模型
 * @author K
 *
 */
public class StaxCursor {
	private static final String db = "/ch02/Catalog.xml";

	// we'll hold values here as we find them
	private Set<String> uniqueAuthors;

	public static void main(String... args) {
		StaxCursor p = new StaxCursor();
		p.find();
	}

	// constructor
	public StaxCursor() {
		uniqueAuthors = new TreeSet<String>();
	}

	// parse the document and offload work to helpers
	public void find() {
		XMLInputFactory xif = XMLInputFactory.newInstance();
		// forward-only, most efficient way to read
		XMLStreamReader reader = null;

		// get ahold of the file
		final InputStream is = StaxCursor.class.getResourceAsStream(db);

		// whether current event represents elem, attrib, etc
		int eventType;
		String current = "";

		try {
			// create the reader from the stream
			reader = xif.createXMLStreamReader(is);

			// work with stream and get the type of event
			// we're inspecting
			while (reader.hasNext()) {
				// because this is Cursor, we get an integer token to next event
				eventType = reader.next();

				// do different work depending on current event
				switch (eventType) {
				case XMLEvent.START_ELEMENT:
					// save element name for later
					current = reader.getName().toString();

					printSkus(current, reader);
					break;

				case XMLEvent.CHARACTERS:
					findAuthors(current, reader);
					break;
				}
			} // end loop
			out.println("Unique Authors=" + uniqueAuthors);

		} catch (XMLStreamException e) {
			out.println("Cannot parse: " + e);
		}
	}

	// get the name and value of the book's sku attribute
	private void printSkus(String current, XMLStreamReader r) {
		current = r.getName().toString();

		if ("book".equals(current)) {
			String k = r.getAttributeName(0).toString();
			String v = r.getAttributeValue(0);
			out.println("AttribName " + k + "=" + v);
		}
	}

	// inspect author elements and read their values.
	private void findAuthors(String current, XMLStreamReader r)
			throws XMLStreamException {

		if ("author".equals(current)) {
			String v = r.getText().trim();

			// can get whitespace value, so ignore
			if (v.length() > 0) {
				uniqueAuthors.add(v);
			}
		}
	}
}

 使用StAX迭代器模型:迭代器API比较灵活,而且易于扩展

import static java.lang.System.out;
import java.io.InputStream;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;

/**
 * StAX迭代器模型
 * @author K
 *
 */
public class StaxIterator {
	private static final String db = "/ch02/Catalog.xml";
	public static void main(String... args) {
		StaxIterator p = new StaxIterator();
		p.find();
	}
	public void find() {
		XMLInputFactory xif = XMLInputFactory.newInstance();
		// forward-only, most efficient way to read
		XMLEventReader reader = null;

		// get ahold of the file
		final InputStream is = StaxIterator.class.getResourceAsStream(db);

		try {
			// create the reader from the stream
			reader = xif.createXMLEventReader(is);

			// work with stream and get the type of event
			// we're inspecting
			while (reader.hasNext()) {
				XMLEvent e = reader.nextEvent();

				if (e.isStartElement()) {
					e = e.asStartElement().getAttributeByName(new QName("sku"));
					if (e != null) {
						out.println(e);
					}
				}
			} // end loop

		} catch (XMLStreamException e) {
			out.println("Cannot parse: " + e);
		}
	}
}

 使用StAX光标API编写XML数据流

import static java.lang.System.out;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

public class WriteStax {
	private static final String REPAIR_NS = "javax.xml.stream.isRepairingNamespaces";

	private static final String NS = "http://ns.example.com/books";

	public static void main(String... args) {
		XMLOutputFactory factory = XMLOutputFactory.newInstance();
		// autobox
		factory.setProperty(REPAIR_NS, true);

		try {
			// setup a destination file
			FileOutputStream fos = new FileOutputStream("result.xml");

			// create the writer
			final XMLStreamWriter xsw = factory.createXMLStreamWriter(fos);
			xsw.setDefaultNamespace(NS);

			// open the document. Can also add encoding, etc
			xsw.writeStartDocument("1.0");
			xsw.writeEndDocument();

			xsw.writeComment("Powered by StAX");

			// make enclosing book
			xsw.writeStartElement("book");
			xsw.writeNamespace("b", NS);
			xsw.writeAttribute("sku", "345_iui");

			// make title child element
			xsw.writeStartElement(NS, "title");
			xsw.writeCharacters("White Noise");
			xsw.writeEndElement(); // close title

			xsw.writeEndElement(); // close book

			// clean up
			xsw.flush();
			fos.close();
			xsw.close();

			out.print("All done.");
		} catch (FileNotFoundException fnfe) {
			fnfe.printStackTrace();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} catch (XMLStreamException xse) {
			xse.printStackTrace();
		}
	}
}

 API非常灵活,允许按照不同程度的规范化和合法性来编写XML。可以快速、清晰底生成这样的XML片段:适合于传输到SOAP主体的有效载荷中或其他任何希望粘贴某种标记的地方。

一般来说,在两种模式中进行抉择时,如果希望能够修改事件流和采用更灵活的API,就选择迭代器。如果希望得到更快的可行新能和更小的空间,就使用光标API

 

使用过滤器来提高应用程序的性能和清晰度,方法是指示解析器只提供我们所感性起的事件,使光标模式解析更有效率。实现StreamFilter接口的accept方法,然后使用它构造XMLStreamReader。当使用EventReader时,要做的所有事情就是实现EventFilter接口的accept方法。

分享到:
评论

相关推荐

    java Stax 解析xml

    ### Java StAX解析XML详解 #### 一、简介与背景 在Java开发中,XML是一种常用的数据交换格式,尤其在处理配置文件或与其他系统进行数据交互时。Java提供了多种解析XML的技术,包括DOM(Document Object Model)、...

    stax 解析xml demo project

    STAX解析XML的过程是通过事件驱动的,即在解析XML时,解析器会触发一系列事件,如遇到元素开始、元素结束、文本节点等,开发者注册监听这些事件,然后在事件触发时进行相应的处理。相比于DOM(Document Object ...

    java 解析xml 多级

    Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细讲解如何在Java中解析XML,特别是针对多级结构的情况。 首先,Java提供了两种主要的API来处理XML:...

    java jdom解析xml

    Java JDOM解析XML是Java开发中处理XML文档的一种方法,JDOM全称为Java Document Object Model,它是一个基于Java语言的API,用于创建、修改和读取XML文档。JDOM为XML处理提供了一种高效且方便的解决方案,尤其适用于...

    java在线解析xml

    Java在线解析XML是一种常见的编程任务,特别是在处理Web服务、数据交换或者从XML文件中提取信息时。XML(Extensible Markup Language)是一种结构化数据格式,它允许数据以自定义的标签进行组织,使得数据的传输和...

    JAVA调用webservice并解析xml

    在IT行业中,调用Web服务并解析XML是常见的任务,特别是在Java开发中。Web服务,尤其是基于SOAP(Simple Object Access Protocol)的,提供了一种标准的跨平台、跨语言的数据交换方式。本教程将深入讲解如何在Java...

    java心电图xml解析.zip

    在Java中,有多种方式可以解析XML文档,主要包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。每种方法都有其优缺点,适用于不同的场景。 1. DOM解析:DOM是将整个...

    java解析XML文件

    Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种可扩展标记语言,常用于数据交换、配置存储等场景。在Java中,有多种方式可以解析XML文件,主要包括DOM(Document Object ...

    java 解析XML性能对比分析Demo

    DOM4J是另一个流行的Java XML处理库,提供了灵活的API,支持DOM、SAX和StAX解析方式。它具有强大的XPath支持,易于学习,适合复杂查询,但内存消耗介于DOM和SAX之间。 5. JAXB(Java Architecture for XML Binding...

    Java解析XML四种方式

    本文将深入探讨Java中解析XML的四种主要方法:DOM、SAX、StAX和JAXB。 1. DOM(Document Object Model) DOM是一种基于树形结构的API,它将整个XML文档加载到内存中,形成一个节点树。你可以通过遍历这个树来访问和...

    java通用解析XML工具类

    以下是一个使用StAX解析XML的示例: ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io.File; public ...

    用Stax组装及解析XML

    使用StAX解析XML文档则需要借助`XMLInputFactory`和`XMLStreamReader`类完成。下面是一个简单的例子: ```java XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory....

    使用java解析XML文件,解析完之后将解析结果导入mysql数据库中

    在Java编程环境中,解析XML文件是一项常见的任务,特别是在数据处理和集成中。XML(Extensible Markup Language)是一种结构化数据格式,广泛用于存储和传输数据。本教程将介绍如何使用Java解析XML文件,并将解析...

    有用的Java工具—XML解析工具StAx

    1. **解析XML(Pull解析器)**:在Java中,我们使用`javax.xml.stream.XMLInputFactory`创建一个输入工厂,然后使用`createXMLStreamReader()`方法创建XML流读取器。通过读取器,我们可以遍历XML事件,如`...

    java txt文件解析xml格式添加到数据库

    2. 使用StAX解析XML: StAX允许程序以迭代方式处理XML,可以逐个读取事件,如下所示: ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream....

    stax+jaxb进行xml解析

    在Java中,有多种方法可以解析XML,其中StAX(Streaming API for XML)和JAXB(Java Architecture for XML Binding)是两种常用的技术。本篇文章将详细探讨如何结合StAX和JAXB进行高效的XML解析。 StAX是一种事件...

    java解析xml例子

    以下是一个使用StAX解析XML的例子: ```java import java.io.FileInputStream; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader;...

    java解析xml的四种经典方法

    Java解析XML的四种经典方法是XML处理中常用的技术,它们分别是DOM、SAX、StAX和JDOM。每种方法都有其独特的特性和适用场景,下面将详细介绍这四种方法。 1. DOM(Document Object Model)解析: DOM是W3C制定的一种...

    kettle 解析xml xml文档,配合kettle 解析xml stax方法,完整解析案例使用

    与上一个版本一起使用可以可以起到提高效率的目的。本人解析xml的真实文档

    详 解Java解析XML

    在Java中,StAX解析器使用`javax.xml.stream.XMLInputFactory`和`javax.xml.stream.XMLOutputFactory`进行创建。StAX适合于需要高效处理大型XML文件且对内存使用敏感的场景,同时也提供了比SAX更简单的编程模型。 4...

Global site tag (gtag.js) - Google Analytics