1、获取一个SAXParserFactory的实例。2、通过factory获取SAXParser实例。
3、新建一个包和继承自DefaultHandler的类。
因为SAX遍历方式,比如便利一个节点<a></a>是需要startHandler便利起始标签<a>,还需要endHandler便利结束标签</a>。
4、将XML文件路径和SAXParserHandler实例对象作为 SAXParser对象 的参数使用。然后运行验证执行初始情况。
5、在SAXParserHandler类中添加一个访问元素的方法,startElement。
6、所以需要进一步修改,条件过滤:
不过,以上是已知标签属性名称的情况下使用的,getValue("id")获取属性值。下面是未知标签属性名称以及个数的情况下,怎么访问标签属性名和属性值。
当我把XML的第一个book节点添加了一个属性和属性值,再运行上面的程序:
7、解析XML文件的节点名和节点间文本。这里需要endElemet方法打印输出一个节点的访问结束。
然后还要重写一个方法characters方法,这个方法的第一个参数char[ ] ch这个是加载了整个xml的数据字节内容。
这里就直接上代码吧:
注意这里用了去尾空格的方法,然后判断为空字符。这个方法比较巧妙。
上代码吧:
1 package com.goodboy.saxtest; 2 3 import java.io.IOException; 4 5 import javax.xml.parsers.ParserConfigurationException; 6 import javax.xml.parsers.SAXParser; 7 import javax.xml.parsers.SAXParserFactory; 8 9 import org.xml.sax.SAXException; 10 11 import com.goodboy.SAXParserHandler.SAXParserHandlerTest; 12 13 public class SAXTest { 14 15 public static void main(String[] args) { 16 SAXParserFactory factory = SAXParserFactory.newInstance(); 17 try { 18 SAXParser sax = factory.newSAXParser(); 19 //创建一个SAXParserHandler对象 20 SAXParserHandlerTest handler = new SAXParserHandlerTest(); 21 //作为参数使用 22 sax.parse("books.xml", handler); 23 } catch (ParserConfigurationException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } catch (SAXException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 } 34 35 }
1 package com.goodboy.SAXParserHandler; 2 3 import org.xml.sax.Attributes; 4 import org.xml.sax.SAXException; 5 import org.xml.sax.helpers.DefaultHandler; 6 7 public class SAXParserHandlerTest extends DefaultHandler { 8 @Override 9 public void startDocument() throws SAXException { 10 super.startDocument(); 11 System.out.println("解析开始"); 12 } 13 @Override 14 public void startElement(String uri, String localName, String qName, 15 Attributes attributes) throws SAXException { 16 super.startElement(uri, localName, qName, attributes); 17 System.out.println("=====开始访问节点"+qName+"====="); 18 //这里的qName是标签名 19 if (qName.equals("book") ) { 20 System.out.println("属性的个数:"+attributes.getLength()); 21 for (int i = 0; i < attributes.getLength(); i++) { 22 String name = attributes.getQName(i); 23 System.out.println("属性名:"+name); 24 String value = attributes.getValue(i); 25 System.out.println("属性值:"+value); 26 } 27 }else if(!qName.equals("book") && !qName.equals("bookstore") ) { 28 System.out.print("属性名:"+qName); 29 } 30 } 31 @Override 32 public void endElement(String uri, String localName, String qName) 33 throws SAXException { 34 super.endElement(uri, localName, qName); 35 System.out.println("=====结束访问节点"+qName+"====="); 36 } 37 @Override 38 public void endDocument() throws SAXException { 39 super.endDocument(); 40 System.out.println("解析结束"); 41 } 42 @Override 43 public void characters(char[] ch, int start, int length) 44 throws SAXException { 45 super.characters(ch, start, length); 46 String name = new String(ch, start, length); 47 if (!name.trim().equals("")) { 48 System.out.println(" 节点中的内容:"+name); 49 } 50 } 51 }
最后 使用SAX解析将XML的内容和结构存入JAVA对象
1、建立一个book类:
后续步骤就制作动态图片了,因为比较繁琐,就直接上代码了:
<理解的要点,就是这里面的重写的中间三个方法(startElement,characters,endElement),他们在解析XML的执行顺序,然后合理的结合这些方法的参数,合理的使用全局变量,将XML转为集合数据>
1 package com.goodboy.SAXParserHandler; 2 3 import java.util.ArrayList; 4 5 import org.xml.sax.Attributes; 6 import org.xml.sax.SAXException; 7 import org.xml.sax.helpers.DefaultHandler; 8 9 import com.goodboy.entity.Book; 10 11 public class SAXParserHandlerTest extends DefaultHandler { 12 Book book = null; 13 String value = null; 14 ArrayList<Book> booklist = new ArrayList<Book>(); 15 public ArrayList<Book> getBooklist() { 16 return booklist; 17 } 18 @Override 19 public void startDocument() throws SAXException { 20 super.startDocument(); 21 System.out.println("解析开始"); 22 } 23 @Override 24 public void startElement(String uri, String localName, String qName, 25 Attributes attributes) throws SAXException { 26 super.startElement(uri, localName, qName, attributes); 27 System.out.println("=====开始访问节点"+qName+"====="); 28 //这里的qName是标签名,也是集合的元素名 29 if (qName.equals("book") ) { 30 book = new Book(); 31 System.out.println("属性的个数:"+attributes.getLength()); 32 for (int i = 0; i < attributes.getLength(); i++) { 33 if(attributes.getQName(i).equals("id")){ 34 book.setId(attributes.getValue(i)); 35 System.out.println("book.getId:"+book.getId()); 36 } 37 } 38 }else if(!qName.equals("book") && !qName.equals("bookstore") ) { 39 System.out.print("属性名:"+qName); 40 } 41 } 42 @Override 43 public void characters(char[] ch, int start, int length) 44 throws SAXException { 45 super.characters(ch, start, length); 46 String name = new String(ch, start, length); 47 if (!name.trim().equals("")) { 48 System.out.println(" 节点中的内容:"+name); 49 value = name; 50 } 51 } 52 @Override 53 public void endElement(String uri, String localName, String qName) 54 throws SAXException { 55 super.endElement(uri, localName, qName); 56 System.out.println("=====结束访问节点"+qName+"====="); 57 if (qName.equals("name")) { 58 book.setName(value); 59 } 60 if (qName.equals("author")) { 61 book.setAuthor(value); 62 } 63 if (qName.equals("year")) { 64 book.setYear(value); 65 } 66 if (qName.equals("prive")) { 67 book.setPrice(value); 68 } 69 if (qName.equals("language")) { 70 book.setLanguage(value); 71 } 72 if (qName.equals("book")) { 73 booklist.add(book); 74 book = null; 75 } 76 value = null; 77 } 78 @Override 79 public void endDocument() throws SAXException { 80 super.endDocument(); 81 System.out.println("book集合的长度"+booklist.size()); 82 System.out.println(booklist.get(0).getName()); 83 System.out.println("解析结束"); 84 } 85 }