test.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="12">
<name>thinking in java</name>
<price>85.5</price>
</book>
<book id="15">
<name>Spring in Action</name>
<price>39.0</price>
</book>
</books>
Book.java
public class Book {
private int id;
private String name;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString(){
return this.id+":"+this.name+":"+this.price;
}
}
ParseTest.java
import java.io.InputStream;
import java.util.List;
public class ParseTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SaxParseService sax = new SaxParseService();
InputStream input = sax.getClass().getClassLoader().getResourceAsStream("test.xml");
List<Book> books = sax.getBooks(input);
for(Book book : books){
System.out.println(book.toString());
}
}
}
SaxParseService.java
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParseService extends DefaultHandler{
private List<Book> books = null;
private Book book = null;
private String preTag = null;//作用是记录解析时的上一个节点名称
public List<Book> getBooks(InputStream xmlStream) throws Exception{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxParseService handler = new SaxParseService();
parser.parse(xmlStream, handler);
return handler.getBooks();
}
public List<Book> getBooks(){
return books;
}
@Override
public void startDocument() throws SAXException {
books = new ArrayList<Book>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("book".equals(qName)){
book = new Book();
book.setId(Integer.parseInt(attributes.getValue(0)));
}
preTag = qName;//将正在解析的节点名称赋给preTag
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("book".equals(qName)){
books.add(book);
book = null;
}
preTag = null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法
,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图
中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方
法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(preTag!=null){
String content = new String(ch,start,length);
if("name".equals(preTag)){
book.setName(content);
}else if("price".equals(preTag)){
book.setPrice(Float.parseFloat(content));
}
}
}
}
分享到:
相关推荐
处理XML文件时,我们通常会使用两种主要的方法:DOM(Document Object Model)和SAX(Simple API for XML)。本文将深入探讨这两种解析方式,并通过代码示例来阐述它们的工作原理。 DOM解析是将整个XML文档加载到...
而SAX(Simple API for XML)是一种解析XML文档的事件驱动模型,它以低内存占用和高效处理大量数据著称。本篇文章将深入探讨如何使用SAX技术读取XML文档,以及SaxReaderXML.rar压缩包中的相关内容。 首先,SAX解析...
标题“使用Sax方法读XML文档:SaxReaderXML.zip”指出,这个压缩包包含了一个关于如何使用SAX解析器来读取XML文档的示例。SAX解析器的工作方式是,当解析到XML文档中的某个元素、属性或文本时,会触发相应的事件,...
本文将深入探讨如何在Android平台上利用SAX(Simple API for XML)解析器来读取和写入XML数据,以及如何利用XML进行后台交互。 SAX是一种事件驱动的XML解析方式,与DOM(Document Object Model)不同,它不需要一次...
而SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,以流式处理XML文档,特别适合处理大型XML文件,因为它不需要将整个文件加载到内存中,从而节省了资源。 SAX解析器在读取XML文档时,会触发一...
2. **非回溯性**:SAX解析器一旦读过一个节点,就不会返回去检查或修改它,因此不适合需要前后文信息的解析场景。 3. **顺序解析**:SAX解析器按照XML文档的顺序逐个处理节点。 **二、SAX解析步骤** 1. **创建...
当解析器读到XML文档的相应部分时,会调用这些方法。例如,`startElement()`会在遇到XML元素的开始标签时被调用,传递元素名和其他相关信息。 以下是一个简单的SAX解析XML的步骤概述: 1. 实现`ContentHandler`...
XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续...
例如,在网络传输中,SAX可以边读边处理,对于动态生成的XML数据尤其适用。 在实际应用中,基于SAX的XML数据结构聚簇存储策略可以用于多种场景,比如网络服务、数据交换、文档管理等。通过结构聚簇存储,能够对XML...
SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调...
1. 对大型文件进行处理时,因为它可以边读边处理,不需要把整个XML文档一次性加载到内存中,从而节省内存; 2. 当只需要XML文件的部分内容,或者只需从文件中得到特定信息时,可以使用SAX实现对特定部分的快速访问;...
- 探索其他XML解析库,如pugixml(更快,更轻量级)或Xerces-C++(更全面,支持DOM和SAX解析)。 - 学习XPath或XSLT,它们是用于查询和转换XML的强大工具。 总结,使用C++读取XML文件涉及选择合适的解析库、理解...
Java 读取XML文件时,有多种解析器可供选择,分别是SAX、DOM、JDOM和DOM4J。这些解析器各有优缺点,适用于不同的场景。 SAX(Simple API for XML)是一种基于事件驱动的解析器。它在解析XML文件时,会按顺序触发一...
SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调...
sax2.0.1版本的jar包,可用于xml文件的解析。...SAX采用事件驱动`,也就是说,它并不是需要解析完整的文档,在按内容顺序解析文档的过程中,Sax会判断当前读到的字符是否符合XMl语法的某部分,如果符合就会触发事件。
然后,解析器读取名为“exampleA.xml”的文件,触发我们之前定义的事件处理器方法。 需要注意的是,这里的`XMLReader`是通过`XMLReaderFactory.createXMLReader()`创建的,并且使用了特定的解析器实现(Apache ...
这段代码读取名为"input.xml"的XML文件,并打印出所有员工节点的相关信息。 2. **SAX解析器**:使用`org.xml.sax.helpers.DefaultHandler`和`org.xml.sax.XMLReader`进行解析。SAX解析器通常适用于处理大型XML文件...
4. **SAX解析**:与DOM不同,SAX解析器不将整个XML文档加载到内存,而是通过事件回调函数处理每个元素的开始和结束、处理属性等。在易语言中,我们需要定义一系列的事件处理函数,如`开始文档`、`结束文档`、`开始...
- 对于大型XML文件,可以考虑使用SAX解析器(在VB.NET中为`XmlReader`),它只读取文档的一部分,从而减少内存占用。 - 如果XML结构固定,可以使用`XDocument`(VB.NET)的LINQ查询,提供更简洁的语法。 通过以上...