9.2 Sax方式对xml数据进行解析

介绍

  1. xml: 可扩展标记语言,作为数据的一种存储格式或用于存储软件的参数,程序解析此配置文件,就可以达到不修改代码就能更改程序的目的。
  2. xml数据示例
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person>
		<name>猴子</name>
		<age>500</age>
	</person>
	<person>
		<name>八戒</name>
		<age>300</age>
	</person>
</persons>

      第一行数据为声明部分。
3. 解析方式

  • Dom方式:将整个xml文档加载到内存中,然后进行处理。缺点显然是不适合处理大文件。
  • Sax方式:从文档头开始以流的方式不断向下进行解析。

SAX方式解析流程

流程

  1. 获取解析工厂
  2. 从解析工厂获取解析器
  3. 编写处理器
  4. 加载文档Document注册处理器
  5. 进行解析, 从当前的类加载器获取文档
  • 在使用时第1、2、4、5步可直接复制粘贴,主要是自己动手实现第3步。

示例

代码:

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 熟悉SAX解析流程
 * 1. 获取解析工厂
 * 2. 从解析工厂获取解析器
 * 3. 编写处理器 
 * 4. 加载文档Document注册处理器
 * 5. 进行解析, 从当前的类加载器获取文档
 * @author dxt
 *
 */
public class XmlTest01 {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
		//SAX解析
		//1. 获取解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//2. 从解析工厂获取解析器
		SAXParser parse = factory.newSAXParser();
		
		//3. 编写处理器,就是去编写PHandler类 
		
		//4. 加载文档Document注册处理器
		PHandler handler = new PHandler();	//其中PHandler是我们自己写的
		//5. 进行解析, 从当前的类加载器获取xmlwendang
		parse.parse(Thread.currentThread().getContextClassLoader()
				.getResourceAsStream("dxt/basic/p.xml"), handler);
	}
}

class PHandler extends DefaultHandler{
	@Override
	public void startDocument() throws SAXException{
		System.out.println("------文档解析开始------");
	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes){
		//开始解析元素,只关注qName, qName为标签
		System.out.println(qName + "--->解析开始");
	}
	
	@Override
	public void characters(char[] ch, int start, int length){
		/*
		 * 在此方法中获取相应标签内的内容
		 * 有一点需要注意的是:xml中的换行、缩进产生的空格 会被识别为标签内的内容
		 * 在使用时,需要处理换行 和 缩进产生的空格
		 */
		String contents = new String(ch, start, length).trim();	//trim()去掉字符串前后的空格
		if(contents.length() > 0){
			System.out.println("内容为:" + contents);
		}else{
			System.out.println("空----空");
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName){
		//解析元素结束
		System.out.println(qName + "--->解析结束");
	}
	
	@Override
	public void endDocument() throws SAXException{
		System.out.println("------文档解析结束------");
	}
}

数据:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person>
		<name>猴子</name>
		<age>500</age>
	</person>
</persons>

结果:
p

注意点

      第3步编写处理器在主程序流程之中并没有代码体现。我们重写的处理器继承类DefaultHandler。
      在处理过程中注意标签间的换行和空格。

SAX方式数据处理

数据

<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person>
		<name>猴子</name>
		<age>500</age>
	</person>
	<person>
		<name>八戒</name>
		<age>300</age>
	</person>
</persons>

代码

Person类:

/**
 * Person类
 * 为了处理xml数据
 * @author dxt
 *
 */
public class Person {
	private String name;
	private int age;
	
	public Person(){}
	public Person(String name, int age){
		super();
		this.name = name;
		this.age = age;
	}
	
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return this.age;
	}
}

处理代码:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 使用SAX处理xml数据
 * 
 * @author dxt
 *
 */
public class XmlTest02 {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
		//1. 获取解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//2. 从解析工厂获取解析器
		SAXParser parser = factory.newSAXParser();
		
		//3. 编写处理器
		
		//4. 加载文档注册处理器
		PersonHandler phandler = new PersonHandler();
		
		//5. 进行解析
		parser.parse(Thread.currentThread().getContextClassLoader()
				.getResourceAsStream("dxt/basic/p.xml"), phandler);
		
		// 获取数据 并打印数据
		List<Person> persons = phandler.getPersons();
		for(Person p:persons){
			System.out.println(p.getName() + "--" + p.getAge());
		}
	}
}

class PersonHandler extends DefaultHandler{
	private List<Person> persons;
	private Person p;
	private String tag; 	//存储操作的标签
	
	public List<Person> getPersons(){
		return persons;
	}
	
	@Override
	public void startDocument(){
		persons = new ArrayList<Person>();
		System.out.println("-------文档解析开始-------");
	}
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes){
		//遇到person开始标签,则初始化一个person
		if(null != qName){
			tag = qName;	//存储标签名
			
			if(tag.equals("person")){
				p = new Person();
			}
		}
	}
	
	public void characters(char[] ch, int start, int length){
		String contents = new String(ch, start, length).trim();
		
		if(tag != null){
			if(tag.equals("name")){
				p.setName(contents);
			}else if(tag.equals("age")){
				p.setAge(Integer.valueOf(contents));
			}
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName){
		//遇到person结束标签,则说明此p的信息已处理完毕,将其加入队列
		if(null != qName){
			if(qName.equals("person")){
				persons.add(p);
			}
		}
		tag = null;
	}
	
	@Override
	public void endDocument(){
		System.out.println("-------文档解析结束-------");
	}
}

结果

p2

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值