java中以SAX方式来对xml文件进行解析操作

要被解析的xml文件对象

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
	<book id="1">
		<name>冰与火之歌</name>
		<author>乔治马丁</author>
		<year>2014</year>
		<price>89</price>
	</book>
	<book id="2">
		<name>安徒生童话</name>
		<author>安徒生</author>
		<year>2017</year>
		<price>77</price>
		<language>Chinese</language>
	</book>
</bookstore>

建立一个book对象用于实现对xml文件当中所解析出来的book对象当中的数据信息值进行保存操作

//建立一个与xml文件所对应的book类实例化对象
public class Book {
	private String id;
	private String name;
	private String author;
	private String year;
	private String price;
	private String language;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
	
}


以SAX方式来对xml文件进行解析时,是自上而下进行解析的,在解析的过程当中程序会自动的调用handler类当中的一些方法

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
//Handler实例化对象用于进行SAX方式的xml文件解析操作
public class SAXParserHandler extends DefaultHandler {
	/*
	 * startElement方法用于遍历xml文件当中的开始标签,即handler类当中的指针对象自上而下每一次遇到一个开始标签时都会调用一次startElement方法
	 */
	int bookIndex=0;//用于记录指针遍历book标签对象的次数
	String value=null;//用于记录子标签对象当中的数据信息值
	Book book=null;//用于存放对xml文件对象进行解析之后的book对象
	private ArrayList<Book> bookList=new ArrayList<Book>();//建立一个对象集合,用于存放所解析出来的book实例化对象数据
	
	public ArrayList<Book> getBookList() {
		return bookList;
	}
	public void setBookList(ArrayList<Book> bookList) {
		this.bookList = bookList;
	}
	@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);
	//qName参数代表当前所指向的开始标签的名字	
		if(qName.equals("book"))
		{//表明开始对book标签当中的属性进行解析操作
			book=new Book();//当解析book表掐你时表明开始对第一本书进行解析操作,则开始创建一个book实例化对象用于存放之后所解析到的book信息值数据
			bookIndex++;//指针对象每一次开始对book标签进行一次遍历操作时,计数器将自动进行+1操作
			System.out.println("====================开始对第"+bookIndex+"本书的遍历操作================");
//		/*以知book标签对象当中只有一个id属性值对象时,根据属性名称来获取属性值*/	
//			String value=attributes.getValue("id");//调用当前book标签当中的attribute对象来获取属性对象id的有效值
//			System.out.println("book标签的id属性值是:"+value);//对id属性对象当中的数据值进行输出操作
		/*当不知道book标签对象当中属性值的名称和属性值的个数时,对book标签对象当中的属性名和属性值进行获取操作*/	
			int num=attributes.getLength();//用于获取当前book标签对象当中的属性的个数
			for(int i=0;i<num;i++)
			{//对book标签当中的属性值进行遍历操作
				System.out.print("book标签当中的第"+(i+1)+"个属性名是:"+attributes.getQName(i));
				System.out.println("---属性值:"+attributes.getValue(i));
				if(attributes.getQName(i).equals("id"))
				{//当解析到了当前book标签对象当中的id属性值时,将id属性值添加到book实例化对象当中
					book.setId(attributes.getValue(i));//将id属性的有效值设置到book对象所对应的属性当中去
				}
			}
		}
		else
		{
			if(!qName.equals("book") && !qName.equals("bookstore"))
			{//表明当前指针指向的是book标签对象当中的子标签对象
				System.out.print("节点名是:"+qName);
			}
		}
	}
	/*
	 * 获取子节点对象当中数据信息值
	 * 当指针对象遍历到子标签name时,将会开始调用characters方法,此时start将会记录为一个起点位置,然后对子标签当中的数据信息对象进行扫描并将所获取的数据信息都放入到ch
	 * 数组对象当中,当结束子标签当中的内容遇到结束标签时,将会记录此时的位置为length
	 *指针对象每一次扫描完一个开始标签之后都会调用characters方法来对标签对象之间的数据信息进行获取和输出操作
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
		value=new String(ch, start, length);//对字符数组当中的数据信息进行获取,即子标签当中的数据信息
		if(!value.trim().equals(""))//当value值不是为空字符串时,对其进行输出操作     trim()返回字符串的副本,忽略前导空白和尾部空白
		System.out.println("---节点值是:"+value);//在输出的结果当中会有较多的空格或空行,是因为子标签对象之间的换行和空格也一同被进行了解析和输出操作
	}
	/*
	 * endElement方法用于遍历标签对象当中的结束标签,每当指针指向结束标签时将会自动调用endElement方法
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(uri, localName, qName);
		//判断当前结束标签是否为book的结束标签
		if(qName.equals("book"))
		{//表明对一本书(一个book标签)遍历结束
			bookList.add(book);//将当前所解析完毕的book对象添加到集合数组当中进行保存操作,
			book=null;//表明一个book对象当中的属性值设置已经完毕开始对下一本书籍进行遍历操作,所以对当前的book对象进行清空操作
			System.out.println("====================结束对第"+bookIndex+"本书的遍历操作================\n");
		}
		else
		{//表明当前所遍历的标签为book标签当中的结束子标签对象
			if(qName.equals("name"))
			{//表明当前所遍历的结束标签为book标签当中name结束子标签对象
				book.setName(value);//value值为characters方法当中所获取到的全局变量值,即两个标签之间的文本数据信息
			}
			if(qName.equals("author"))
			{//当前遍历到的为book标签当中的author子标签对象
				book.setAuthor(value);
			}
			if(qName.equals("year"))
			{
				book.setYear(value);
			}
			if(qName.equals("price"))
			{
				book.setPrice(value);
			}
			if(qName.equals("language"))
			{
				book.setLanguage(value);
			}
		}
	}
	/*
	 * 用来标志开始对xml文件对象开始进行解析操作
	 */
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("SAX解析操作开始");
	}
	/*
	 * 用于标志对xml文件对象的解析操作结束
	 */
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		System.out.println("SAX解析操作结束");
	}
}


import java.io.IOException;

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

import org.xml.sax.SAXException;

//以SAX的方式来对xml文件进行解析操作
public class SAXTest {

	public static void main(String[] args) {
		//1:获取SAXParserFactory实例化工厂对象
		SAXParserFactory factory=SAXParserFactory.newInstance();
		//2:通过SAXParserFactory工厂实例化对象来获取SAXParser实例化对象
		try {
		//通过工厂对象来实例化一个解析器对象	
			SAXParser parser=factory.newSAXParser();//该解析器对象可以对xml文件对象进行解析操作
		//创建一个Handler实例化对象
			SAXParserHandler handler=new SAXParserHandler();//用于对xml文件进行解析操作时需要
			//使得解析器对指定路径下的xml文件对象进行解析 	,在进行解析操作开始时虚拟机将会自动调用handler类当中的startDocument方法来开始对xml文档进行解析操作
/*
 * 类是于handler类当中有一个指针对象当其指向xml文件当中的第一行<?xml version="1.0" encoding="UTF-8" ?>时,认为开始解析将会调用向对应的方法,当指针指向最后一个标签
 * 时则认为解析结束,调用endDocument方法			
 */
				parser.parse("xml文件/books.xml",handler);
				System.out.println("一共有"+handler.getBookList().size()+"本书籍被进行了解析出来。");
				for(Book book:handler.getBookList())//对书籍集合对象当中所解析到的书籍对象进行遍历输出操作
				{
					System.out.println(book.getId());
					System.out.println(book.getName());
					System.out.println(book.getAuthor());
					System.out.println(book.getYear());
					System.out.println(book.getPrice());
					System.out.println(book.getLanguage());
					System.out.println("-----------finish------------");
				}
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



程序运行的结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值