慕课网——SAX解析XML

//这是Test
public class SAXTest {

	public static void main(String[] args) {
		// 获取一个SAXParserFactory的实例
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 通过factory获取SAXParser实例
		try {
			SAXParser parser = factory.newSAXParser();
			// 创建SAXParserHandler对象
			SAXParserHandler handler = new SAXParserHandler();
			parser.parse("books.xml",handler);
			System.out.println("共有" + handler.getBookList().size() + "本书");
			for (Book book : handler.getBookList()) {
				System.out.println(book.getId());
				System.out.println(book.getName());
				System.out.println(book.getAuthor());
				System.out.println(book.getYear());
				System.out.println(book.getPrice());
				System.out.println(book.getLanguage());
				System.out.println("--------完成----------");
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
<pre name="code" class="java">//这是Handler
//这里继承这个包:org.xml.sax.helpers.DefaultHandler
public class SAXParserHandler extends DefaultHandler {
	int bookIndex = 0;
	// 为了方便方法之间调用参数,将value做成全局变量
	String value = null;
	// 为了方便方法之间调用参数,将book做成全局变量
	Book book = null;
	//为了防止每次都会覆盖掉book中的内容,这里定义一个ArrayList存储
	ArrayList<Book> bookList = new ArrayList<Book>();
	public ArrayList<Book> getBookList() {
		return bookList;
	}

	/**
	 * 用来表示解析开始
	 */
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("SAX解析开始");
	}

	/**
	 * 用来表示解析开始
	 */
	public void endDocument() throws SAXException {
		super.endDocument();
		System.out.println("SAX解析结束");
	}

	/**
	 * 用来遍历xml文件的开始标签
	 */
	public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
		// 调用DefaultElement类的startElement方法
		super.startElement(uri,localName,qName,attributes);
		// 开始解析book元素的属性
		if (qName.equals("book")) {
			// 为了将解析的内容存入book对象中
			book = new Book();
			// Book book = new Book();
			bookIndex++;
			System.out.println("=============开始" + bookIndex
					+ "书内容的============");
			/**
			 * 已知属性名称,根据属性名称获取属性值 String value = attributes.getValue("id");
			 * System.out.println("book的属性值是: " + value);
			 */
			// 若不知道属性名称,做成循环遍历
			int num = attributes.getLength();
			for (int i = 0; i < num; i++) {
				System.out.print("book元素的" + (i + 1) + "个属性名是: "
						+ attributes.getQName(i));
				System.out.println("----属性值是: " + attributes.getValue(i));
				if (attributes.getQName(i).equals("id")) {
					book.setId(attributes.getValue(i));
				}
			}
		} else if (!qName.equals("book") && !qName.equals("bookstore")) {
			System.out.println("节点名是: " + qName);
		}
	}

	/**
	 * 用来遍历xml文件的结束标签
	 */
	// qName决定了是遍历当中的setId、setElement还是setAuthor
	public void endElement(String uri,String qName)
			throws SAXException {
		// 调用DefaultHandler类的endElement方法
		super.endElement(uri,qName);
		// 判断是否针对一本书已经遍历结束
		if (qName.equals("book")) {
			bookList.add(book);
			//在遍历下一本书之前,清空book
			book = null;
			System.out.println("=============结束" + bookIndex
					+ "书内容的============");
		} else if (qName.equals("name")) {
			book.setName(value);
		} else if (qName.equals("author")) {
			book.setAuthor(value);
		} else if (qName.equals("year")) {
			book.setYear(value);
		} else if (qName.equals("price")) {
			book.setPrice(value);
		} else if (qName.equals("language")) {
			book.setLanguage(value);
		}
	}

	// ch指的是整个xml文档内容,start指的是开始节点,length指的是元素长
	// 同样这里的空行也会作为需要解析的text
	public void characters(char[] ch,int start,int length)
			throws SAXException {
		super.characters(ch,start,length);
		// String value = new String(ch,length);
		// 为了方便方法之间调用参数,将value做成全局变量
		value = new String(ch,length);
		if (!value.trim().equals("")) {
			System.out.println("节点值是: " + value);
		}
	}
}
<pre name="code" class="java">//这是Book
public class Book {
	private String id;
	private String name;
	private String author;
	private String year;
	private String price;
	private String language;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	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 getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
}

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...