(此文为(https://www.imooc.com/video/4482)之随笔)

1、用SAX解析xml文件大致分为三步

写了一个XML文件作为例子

(1)main方法代码如下:

import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SAX { public static void main(String[] args) {
//1、获取一个SAXParserFactory的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//2、通过factory获取SAXParser的实例
SAXParser parser = factory.newSAXParser();
//3、创建SAXParserHandler对象
SAXParserHandler handler = new SAXParserHandler();
parser.parse("book.xml", handler);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

(2)SAXParserHandler方法

package cn.edu.zzuli.SAXTest;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserHandler extends DefaultHandler {
/**
* 用来遍历xml文件的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
}
/**
* 用来遍历xml文件的结束标签
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
}
/**
* 用来表示解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来表示解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
} }

当读到<?xml version="1.0" encoding="UTF-8"?>时解析开始,当读到最后一个节点结束标识(</>)解析结束

2、使用SAX解析节点名和节点间文本

重写SAXParserHandler类里的startElement方法

public class SAXParserHandler extends DefaultHandler {
int bookindex = 1;
/**
* 用来遍历xml文件的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//调用DefaultHandler类的startElement方法
super.startElement(uri, localName, qName, attributes);
//开始解析book元素的属性
if(qName.equals("book")) {
System.out.println("------------现在开始遍历第" + bookindex + "本书---------");
//已知book元素下属性的名称,根据名称获取属性值
String value = attributes.getValue("id");
System.out.println("book的属性值是:" + value);
//不知道book元素下属性的名称以及个数,如何获取元素名称及属性
int num = attributes.getLength();
for(int i = 0;i < num;i++) {
System.out.print("第" + (i + 1) + "个book元素的属性名是" + attributes.getQName(i));
System.out.println("----book元素的属性值是" + attributes.getValue(i));
}
}else if(!qName.equals("book") && !qName.equals("bookstore")){
System.out.print("节点名是" + 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(qName.equals("book")) {
System.out.println("------------结束遍历第" + bookindex++ + "本书---------");
}
}
/**
* 用来表示解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来表示解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String value = new String(ch, start, length);
     //通过trim()截掉空格和换行符,如果是空字符则跳过if执行语句
if(!value.trim().equals(""))
System.out.println("节点值为" + value);
}
}

输出结果为:

(2)将book节点结构信息保存,用一个book类来保存

重新写SAXParserHandler类

public class SAXParserHandler extends DefaultHandler {
int bookindex = 1;
//定义全局变量是为了使book对象和value值可以被多个方法访问
Book book =null;
String value = null;
private ArrayList<Book> bookList = new ArrayList<>();
public ArrayList<Book> getBookList() {
return bookList;
}
/**
* 用来遍历xml文件的开始标签
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//调用DefaultHandler类的startElement方法
super.startElement(uri, localName, qName, attributes);
//开始解析book元素的属性
if(qName.equals("book")) {
//每一次遇到book就建立新的book对象
book = new Book();
System.out.println("------------现在开始遍历第" + bookindex + "本书---------");
//已知book元素下属性的名称,根据名称获取属性值
String value = attributes.getValue("id");
System.out.println("book的属性值是:" + value);
//不知道book元素下属性的名称以及个数,如何获取元素名称及属性
int num = attributes.getLength();
for(int i = 0;i < num;i++) {
System.out.print("第" + (i + 1) + "个book元素的属性名是" + attributes.getQName(i));
System.out.println("----book元素的属性值是" + attributes.getValue(i));
if(attributes.getQName(i) == "id") {
book.setId(attributes.getValue(i));
}
}
}else if(!qName.equals("book") && !qName.equals("bookstore")){
System.out.print("节点名是" + 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(qName.equals("book")) {
//把信息存入book对象之后,加到ArrayList之中
bookList.add(book);
//将book对象清空
book = null;
System.out.println("------------结束遍历第" + bookindex++ + "本书---------");
}else if(qName.equals("name")) {
book.setName(value);
}else if(qName.equals("id")) {
book.setId(value);
}else if(qName.equals("year")) {
book.setYear(value);
}else if(qName.equals("money")) {
book.setMoney(value);
}else if(qName.equals("color")) {
book.setColor(value);
}else if(qName.equals("auther")) {
book.setAuther(value);
}
}
/**
* 用来表示解析开始
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("SAX解析开始");
}
/**
* 用来表示解析结束
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("SAX解析结束");
}
     /**
* 用来求得节点值
*/

    @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);
    }

 
 

用SAX解析xml文件,java的更多相关文章

  1. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  2. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  3. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

  4. 安卓SAX解析XML文件

    XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...

  5. SAX解析xml文件

    需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...

  6. cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

    今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...

  7. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  8. Java中实现SAX解析xml文件到MySQL数据库

    大致步骤: 1.Java bean 2.DBHelper.java 3.重写DefaultHandler中的方法:MyHander.java 4.循环写数据库:SAXParserDemo.java ① ...

  9. 使用SAX解析XML文件

    SAX这是Simple API for XML缩写,它不是由引起W3C拟议标准正式.尽管如此,使用SAX很少几个,点儿全部的XML解析器都会支持它. 与DOM比較而言,SAX是一种轻量型的方法. 我们 ...

随机推荐

  1. C++中字符串换行(如何拆分为多行)

    在C/C++语言中,可能我们要书写的一个字符串太长了,放在一行上影响代码的可读性.这时我们就需要多行书写了.   字符串多行书写有两种规则:  1. 在字符串换行处加一个反斜杠’\’,下一行前不能有空 ...

  2. [UnityShader基础]08.UI-Default.shader

    参考链接: https://zhuanlan.zhihu.com/p/32561155 https://blog.csdn.net/WuShangLZ/article/details/80401441 ...

  3. MVC的开发模式简单介绍

    MVCM model 模型 实体类和业务和dao dao(数据库访问对象)V view 视图 jspC controller 控制器 servlet 作用:视图和逻辑分离 开发设计顺序 1.设计数据库 ...

  4. Jmeter5.1.1创建一个http请求的压力测试

    1.首先添加一个线程组,在线程组中,配置压力情况 2.然后在线程组中,添加取样器,添加http请求:配置web服务器协议(http/https).服务器名称或IP.端口号.请求方法.路径等参数 3.然 ...

  5. Vue初接触 stage1

    开始学Vue辣!哈哈哈哈哈真的好好玩啊Vue!这个写法我真的太爱了! stage1 4-27 先写一下安装Vue devtools时遇到的问题(说来神奇,我是写第一个实例的时候试着在控制台打印了这个空 ...

  6. JUnit4源码学习笔记

    先上一个在Spring-test下运行的调用栈 自底向上: JUnitStarter IDEA对JUnit的支持,调用JUnitCore.run(Runner),将注解@RunWith指定的Runne ...

  7. as3 加载进来的swf进行缩放

    private function swfComHdl(_loader:Loader, _data:*= null){ frameLder = _loader; gameMC = frameLder.c ...

  8. P4702 取石子

    我什么时候写一下污污的小故事呢?反正不是现在. 题目描述 Alice 和 Bob 在玩游戏. 他们有 nn 堆石子,第 ii 堆石子有 a_iai​ 个,保证初始时 a_i \leq a_{i + 1 ...

  9. 2017-11-11 Sa Oct 消参

    2017-11-11 Sa Oct 消参 Prior versions: 2017-11-04 Sa Oct 消参 2017-11-10 Fr Oct 消参 2017-11-04 Sa $ P(-3, ...

  10. Unity shader 官网文档全方位学习(二)

    摘要: 这篇文章主要介绍Lighting model及自定义Lighting model 上文咱们学了surface shader.这玩意在开始的时候啊,在定义哪个函数处理surface时用一定要指定 ...