Java眼中的XML--文件读取--2 应用SAX方式解析XML

 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 }
SAXTest(main)
 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 }
DefaultHandler对象

 最后  使用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 }
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/goodboy-heyang/p/4747222.html