Java解析XML(一)、SAX

package xml;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import model.Book;

/**
 * 使用SAX解析XML文件
 */
public class SaxHelper {

	private static SAXParserFactory spf;

	/**
	 * 使用SAX方式解析XML文件
	 * @param is XML文件输入流
	 * @return
	 */
	public static List<Book> saxReader(InputStream is) {
		try {
			if (spf == null)
			 spf = SAXParserFactory.newInstance();
			SAXParser saxParser = spf.newSAXParser();
			XmlContentHandler xmlContentHandler = new XmlContentHandler();
			saxParser.parse(is, xmlContentHandler);
			return xmlContentHandler.getBooks();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

package xml;

import java.util.ArrayList;
import java.util.List;

import model.Book;

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

import util.DateUtils;

/**
 * SAX解析XML文件的事件处理器
 */
public class XmlContentHandler extends DefaultHandler {

	private Book book;	//保存每一个节点的对象

	private List<Book> books;	//保存已解析好的节点对象

	private String preTag;		//保存当前正在解析的节点标签名

	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始解析文档...");
		books = new ArrayList<Book>();
	}

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		if (name.equals("book") && book == null) {
			book = new Book();
			book.setIsbn(attributes.getValue("", "isbn"));
		}

		preTag = name;	//记录当前开始节点名
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (book != null && preTag != null && !"book".equals(preTag) && !"books".equals(preTag)) {
			String data = new String(ch,start,length);
			if (!"".equals(data.trim())) {
				if ("name".equals(preTag)) {
					book.setName(data);
				} else if ("author".equals(preTag)) {
					book.setAuthor(data);
				} else if ("publishing".equals(preTag)) {
					book.setPublishing(data);
				} else if ("pubdate".equals(preTag)) {
					book.setPubdate(DateUtils.string2Date("yyyy-mm-dd", data));
				} else if ("price".equals(preTag)) {
					book.setPrice(Double.parseDouble(data));
				}
			}
		}
	}

	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		if ("book".equals(name) && book != null) {
			books.add(book);
			book = null;	//一个节点的结束,代表一本书的信息解析完成,所以要将book设为null
		}
		preTag = null;		//同时将当前书的节点设为null
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("XML文件解析结束...");
		System.out.println("结果:" + books);
	}

	/**
	 * 获得解析后的数据
	 * @return
	 */
	public List<Book> getBooks() {
		return books;
	}

}

package model;

import java.util.Date;

/**
 * 图书
 */
public class Book {

	/**
	 * 图书编号
	 */
	private String isbn;

	/**
	 * 书名
	 */
	private String name;

	/**
	 * 作者
	 */
	private String author;

	/**
	 * 出版社
	 */
	private String publishing;

	/**
	 * 发布时间
	 */
	private Date pubdate;

	/**
	 * 价格
	 */
	private double price;

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getPublishing() {
		return publishing;
	}

	public void setPublishing(String publishing) {
		this.publishing = publishing;
	}

	public Date getPubdate() {
		return pubdate;
	}

	public void setPubdate(Date pubdate) {
		this.pubdate = pubdate;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String toString() {
		return "name: " + name + " isbn: " + isbn + " author: " + author
				+ " publishing: " + publishing + " pubdate: " + pubdate
				+ " price: " + price;
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<books>
	<!-- ISBN:国际标准书号由13位数字组成。前三位数字代表图书,中间的9个数字分为三组,分别表示组号、出版社号和书序号,最后一个数字是校验码。 -->
	<book isbn="9787121025389">
		<name>JAVA面向对象编程</name>
		<author>孙卫琴</author>
		<publishing>电子工业出版社</publishing>
		<pubdate>2006-07-01</pubdate>
		<price>50.60</price>
	</book>
	<book isbn="9787111349662">
		<name>深入理解Java虚拟机:JVM高级特性与最佳实践</name>
		<author>周志明</author>
		<publishing>机械工业出版社</publishing>
		<pubdate>2011-07-01</pubdate>
		<price>46.20</price>
	</book>
	<book isbn="9787508338408">
		<name>Java网络编程(第3版)</name>
		<author>(英)哈诺德 著 朱涛江,林剑 译</author>
		<publishing>中国电力出版社</publishing>
		<pubdate>2005-11-01</pubdate>
		<price>63.80</price>
	</book>
	<book isbn="9787508379661">
		<name>Java经典实例(第2版)</name>
		<author>(美)达尔文(Darwin,F.I) 著 关丽荣,张晓坤 译</author>
		<publishing>中国电力出版社</publishing>
		<pubdate>2009-02-01</pubdate>
		<price>72.10</price>
	</book>
	<book isbn="9787111213826">
		<name>Java编程思想(第4版)</name>
		<author>(美)埃克尔 著 陈昊鹏 译</author>
		<publishing>机械工业出版社</publishing>
		<pubdate>2007-06-01</pubdate>
		<price>74.50</price>
	</book>
	<book isbn="9787508344980">
		<name>Head First Java(中文版)(第2版)</name>
		<author>(美)塞若(Sierra,K.),(美)贝茨(Bates,B.) 著 O’Reilly Taiwan公司 译 张然,等 编</author>
		<publishing>中国电力出版社</publishing>
		<pubdate>2007-02-01</pubdate>
		<price>55.20</price>
	</book>
	<book isbn="9787111231837">
		<name>数据结构与算法分析:Java语言描述(第2版)</name>
		<author>(美)韦斯(Weiss,M.A.) 著 冯舜玺 译</author>
		<publishing>机械工业出版社</publishing>
		<pubdate>2009-01-01</pubdate>
		<price>41.20</price>
	</book>
</books>
时间: 2025-01-20 13:58:39

Java解析XML(一)、SAX的相关文章

java解析xml之sax解析xml示例分享_java

复制代码 代码如下: package com.test; import java.io.File;import java.io.FileInputStream;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.x

Php利用java解析xml

xml 作者: 雨伞首先如果你对JAVA不感兴趣或者说你的主机不支持JAVA或者你也不打算学习的话请不要浪费时间在这里. 请先安装JAVA的执行环境与PHP结合,具体参考http://www.phpx.com/happy/thr78795.html 或者下载http://www.javax.org/download/php_java.rar里面我写有个readme.txt说明文档,这个压缩包是个简单的例子. 要下载我的JAVA源码请到http://www.javax.org/download/J

JAVA解析XML

在JAVA中最常用的解析xml的方式有四种,分别为:sax.dom.dom4j.jdom.sax方式的解析是基于事件的,比较适合大数据的解析,而dom的方式会将xml加载到内存中,构建出dom树,解析大文件时容易造成内存溢出,在实际开发中,我们应该选择最合适的解析方式. 假设我们有这样一个xml文件: <xml> <userId><![CDATA[jianggujin]]></userId> <userName><![CDATA[蒋固金]]

java解析xml文件多个线程同时访问时内存溢出

问题描述 java解析xml文件多个线程同时访问时内存溢出,代码如下:解析的xml文件大小大概2M-10M,该怎么解决呢? String sourceFile = ConfigReader.get("data.store.path") + article.getSourceFile();org.dom4j.Document document = null;FileInputStream fin = null;try {fin = new FileInputStream(new File

Java解析xml的四种方法汇总_java

1. DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX

java解析xml的问题

问题描述 我的目的是吧<clothes>到</clothes>和<comfort>到</comfort>中的index.suggestion.icon的数值拿出来,我该怎么弄?例如:输出6.建议着寒冷服装.chuanyi_6.jpg<clothes><chuanyi-zhishuindex="6"/><chuanyi-jianyisuggestion="建议着寒冷服装"/><c

java解析xml二种方法

java解析xml二种方法 配置文件为: <?xml version="1.0" encoding="utf-8"?> <config>     <point name="test1">         <name>zhang3</name>         <address>abcdefg</address>         <email>a@b.c

详解Java解析XML的四种方法_java

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

java解析xml的问题。。。

问题描述 java解析xml的问题... 我有三个xml文件,里面的节点格式不一致大致相同,怎么样写个通用的方法将我指定的内容读取出来? 解决方案 http://blog.csdn.net/wwww1988600/article/details/9019785 解决方案二: 原文:点击打开链接 今日在开发一个实现读取XML文件指定节点的值或属性值的公用方法时,碰到了中文乱码问题,最终通过百度和google把它搞定了,今天在这里发表一下,一个作为自己的资源,另一个也希望能给其他人带来一些帮助. x

java解析xml文件中数据,数据之间用0x2588做分隔符,怎么解析

问题描述 java解析xml文件中数据,数据之间用0x2588做分隔符,怎么解析 java解析xml文件中数据,数据之间用0x2588做分隔符,0x2588做分隔符分隔符问题,这个0x2588的分隔符怎么处理 解决方案 xml字符串.split((char)(0x2588)) 解决方案二: 我试试 ,谢谢好心人,谢谢你抽出时间 谢谢