SAX解析原理:

使用Handler去逐个分析遇到的每一个节点

SAX方式解析步奏:

创建xml解析需要的handler(parser.parse(file,handler))

package com.imooc_xml.sax.handler;import java.util.ArrayList;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import com.imooc_xml.sax.entity.Book;public class SAXParserHandler extends DefaultHandler {//使用全局变量可以使本类的各个方法通用,联系int bookIndex = 0 ;String value = null;Book book = null;private ArrayList<Book> bookList = new ArrayList<Book>();public ArrayList<Book> getBookList() {return bookList;}/*** 用来遍历xml文件的开始标签*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// TODO Auto-generated method stubsuper.startElement(uri, localName, qName, attributes);解析xml文件的节点属性,只有book节点有属性if(qName.equals("book")){book = new Book();bookIndex++;//已知book的属性名
//            attributes.getValue("id");//不知book元素的属性名和个数int num = attributes.getLength();for(int i=0;i<num;i++){//book元素的第i+1个属性名
                attributes.getQName(i);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文件的结束标签*/@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, qName);//判断是否针对一本书已经遍历结束if (qName.equals("book")){bookList.add(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);}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);//ch是节点之间的文本内容value = new String(ch, start, length);//判断空格和换行if(!value.trim().equals("")){System.out.println(value);}}/*** 用来标志解析开始*/@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stubsuper.startDocument();System.out.println("SAX解析开始");}/*** 用来标志解析结束*/@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stubsuper.endDocument();System.out.println("SAX解析结束");}
}

创建hanlder类

SAX解析准备工作:

package com.imooc_xml.sax.test;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import com.imooc_xml.sax.handler.SAXParserHandler;public class SAXTest {public static void main(String[] args) {//通过SAXParserFactory的静态newInstance()方法获取SAXParserFactory的实例factorySAXParserFactory factory = SAXParserFactory.newInstance();try {//通过factory获取SAXParser实例SAXParser parser = factory.newSAXParser();//创建一个handler对象SAXParserHandler handler = new SAXParserHandler();parser.parse("xml/books.xml", handler);} catch (ParserConfigurationException | SAXException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}
}

使用SAX解析xml文件的节点属性:

//只有book节点有属性if(qName.equals("book")){//已知book的属性名
//            attributes.getValue("id");//不知book元素的属性名和个数‘int num = attributes.getLength();for(int i=0;i<num;i++){//book元素的第i+1个属性名
                attributes.getQName(i);attributes.getValue(i);}}

使用SAX解析xml文件的节点值

 @Overridepublic void characters(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stubsuper.characters(ch, start, length);//ch是节点之间的文本内容value = new String(ch, start, length);//判断空格和换行if(!value.trim().equals("")){System.out.println(value);}}

在Java中保留xml数据的结构

public class Book {private String id;private String name;private String author;private String year;private String price;private String language;

获取对象集合:

handler.getBookList().size();for(Book book:handler.getBookList()){System.out.println(book.getId());          ....}

转载于:https://www.cnblogs.com/Nyan-Workflow-FC/p/6412246.html

java--xml文件读取(SAX)相关推荐

  1. jdom 读取xml_JDOM分析器–将XML文件读取为Java对象

    jdom 读取xml JDOM parser provides us a great Java XML API to read, edit and write XML documents easily ...

  2. Java CSV文件读取、写入及追加

    Java CSV文件读取.写入及追加 https://blog.csdn.net/liq816/article/details/81286472 追加: FileOutputStream out = ...

  3. saxreader读取服务器xml文件,使用SAXReader从xml文件读取元素

    我试图使用SAXReader读取下面的xml内容 我必须读取节点名称"SelogerListController"的子元素. 节点名称"SelogerListContro ...

  4. javascript读取xml文件读取节点数据的例子

    分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> < ...

  5. 从XML文件读取数据绑定到列表控件2

    ComponentArt.Web.UI控件绑定所用XML,同时用于DropDownList的绑定,XML如下: <SiteMap>   <item Text="标题一&qu ...

  6. java压缩文件读取_用Java读取/写入压缩和非压缩文件

    java压缩文件读取 这篇文章的主要原因是尝试不要重复自己( DRY ),因为通常,我会遇到递归的需求,即读写压缩的和非压缩的文件(主要是JSON和CSV). 首先让我们看看如何读取文本文件. 注意我 ...

  7. java操作XML文件--读取内容

          先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类       由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问 ...

  8. java xml文件内容替换_java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.java importjava.io.FileInputStream;importjava.io.FileWriter;impo ...

  9. java sax xml文件解析_java解析xml文件-DOM/SAX

    java解析xml文件的两种方式 1:DOM 原理:把整个文档加载到内存,转化成dom树,之后应用程序可以随机的访问dom树的任何数据,灵活 快,但消耗内存 一个简单的xml 使用java解析 //b ...

  10. Java中解析XML文件之SAX方式

    1.SAX解析方式,是将XML文件逐行读进内存进行解析的. 2.首先编写一个SAXHandler(SAX处理类),这个类需要继承DefaultHandler类 3.在SAXHandler类中需要重写s ...

最新文章

  1. 为什么 CTO、技术总监、架构师都不写代码,还这么牛?
  2. Centos7 修改运行级别
  3. [bzoj3143] [HNOI2013]游走
  4. 标准粒子群算法(PSO)及其Matlab程序和常见改进算法
  5. 表贴电阻尺寸与什么有关_PCB板上为什么要“贴黄金”?
  6. 云炬随笔20210731(2)
  7. 2014年世界互联网大会---马云篇
  8. Git使用命令行回退版本git reset --hard
  9. 阿里《Java手册》做一个有技术情怀的人
  10. 消息中间件—Kafka 的设计思想
  11. [leetcode]5179. 将二叉搜索树变平衡
  12. 用C/C++编程技术教你制作彩票随机程序
  13. 今天解封了,该递交作业了,我做了个智能机器人
  14. 蛋白质组学与转录组学联合分析
  15. 【微信红包封面】哆啦A梦 x GUCCI古驰限定版!!
  16. 双系统如何修改系统默认启动项?简易教程
  17. 弗洛伊德与他的精神分析学
  18. 设置短信验证码开发的回调地址-短信平台验证码开发9
  19. 异或的4种神奇的运用场景
  20. STM32小四轴超低成本方案开源项目

热门文章

  1. 平衡二叉树的自顶向下递归和自底向上递归
  2. 名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...
  3. Java instead of 用法_我又不是你的谁--java instanceof操作符用法揭秘
  4. 巡回沙龙_美浮特全国巡回沙龙第一期结束撒花!
  5. android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet
  6. Brush notes:stack、queue、heap
  7. 【数据结构基础笔记】【顺序表】
  8. scala字符串的拉链操作_在Scala中对字符串进行操作
  9. 第五章 条件、循环及其他语句
  10. php 字符串匹配 like,ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法...