xml文件:
<?xml version="1.0" encoding="UTF-8"?> <books> <!--根节点--><!--这里的空白也算一个节点,所以books共有5个子节点--> <book id="book1" w="wwwww"> <name><a>AAAAAA</a>bookName1</name> <price>10.0</price> </book> <book id="book2"> <name>bookName2</name> <author>bookAuthor2</author> </book> </books>
测试类:
package com.zhang.xml.sax; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /* * sax解析是逐行扫描文档,一边扫描一边解析。 * 需要创建一个org.xml.sax.helpers.DefaultHandler的继承类 */ public class SaxParse { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); SaxParser handler = new SaxParser(); parser.parse("books.xml", handler); System.out.println(handler.getBooks()); } }
org.xml.sax.helpers.DefaultHandler的子类
package com.zhang.xml.sax; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.zhang.xml.bean.Book; public class SaxParser extends DefaultHandler { private int index = 0; private List<Book> books = new ArrayList<Book>(); private Book book = null; private String value = null; public List<Book> getBooks() { return books; } /** * 用来标识解析开始 */ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("----------开始解析文档----------"); } /** * 用来标识解析结束 */ @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("----------结束文档解析----------"); } /** * 解析一个xml元素 * 每遇到一个元素的开始标签就调用一次该方法 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if("book".equals(qName)){ index++; System.out.println("---开始解析第" + index + "个book标签---"); book = new Book(); int size = attributes.getLength(); for(int i=0; i<size; i++) { System.out.print("第" + (i + 1) + "个属性名: " + attributes.getQName(i)); System.out.println("-->属性值:" + attributes.getValue(i)); if("id".equals(attributes.getQName(i))) { book.setId(attributes.getValue(i)); } } } else { System.out.println("遇到" + qName + "开始标签"); } } /** * 结束一个解析xml元素 * 每遇到一个元素的结束标签就调用一次该方法 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if("book".equals(qName)){ System.out.println("---结束解析第" + index + "个book标签---"); books.add(book); book = null; } else if("name".equals(qName)) { book.setName(value); } else if("price".equals(qName)) { book.setPrice(value); } else if("author".equals(qName)) { book.setAuthor(value); } else { System.out.println("遇到" + qName + "结束标签"); } } /* * ch中存放着xml文档中所有的元素的值,每遇到一个元素的值,就调用一次该方法 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); value = new String(ch, start, length); if (!value.trim().equals("")) { // 排除空白位置 System.out.println("-->value值:" + value); } } }
结果:
----------开始解析文档---------- 遇到books开始标签 ---开始解析第1个book标签--- 第1个属性名: id-->属性值:book1 第2个属性名: w-->属性值:wwwww 遇到name开始标签 遇到a开始标签 -->value值:AAAAAA 遇到a结束标签 -->value值:bookName1 遇到price开始标签 -->value值:10.0 ---结束解析第1个book标签--- ---开始解析第2个book标签--- 第1个属性名: id-->属性值:book2 遇到name开始标签 -->value值:bookName2 遇到author开始标签 -->value值:bookAuthor2 ---结束解析第2个book标签--- 遇到books结束标签 ----------结束文档解析---------- [Book [id=book1, name=bookName1, price=10.0, author=null], Book [id=book2, name=bookName2, price=null, author=bookAuthor2]]
时间: 2024-10-10 04:02:36