• 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 }
     
     
     
     
     
     
     
  • 相关阅读:
    内部类概述和访问特点
    权限修饰符 权限
    抽象类和接口作为返回值类型的问题
    抽象类和接口作为形参问题
    jdbc:java数据库连接
    类与类、类与接口、接口与接口的关系
    接口
    抽象类
    多态
    继承中构造方法的关系
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/4747222.html
Copyright © 2020-2023  润新知