本文主要是介绍XML解析之----SAX解析(带属性与不带属性)----自定义Handler类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在XML的解析中,有几种方式,其中用的比较多的一种是 XmlPullParserFactory, Pull解析工厂,这种比较常用,但需要借助外部jar包的支持,还有一中就是今天讲的SAXParserFactory解析工厂,他的存在意义在与不需要jar包的支持,JDK本身就可以支持!
这个是不带属性的XML文件内容:
<?xml version="1.0" encoding="GBK"?><games><game><id>1</id><name>完美国际2</name><company>完美世界</company></game><game><id>2</id><name>LOL</name><company>Tencent</company></game><game><id>3</id><name>DOTA</name><company>暴雪</company></game></games>
这个是带属性的XML文件内容:
<?xml version="1.0" encoding="GBK"?><games><game id="1"><name>完美国际2</name><company>完美世界</company></game><game id="2"><name>LOL</name><company>Tencent</company></game><game id="3"><name>DOTA</name><company>暴雪</company></game></games>
package com.ctgu.sax;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.XMLReader;public class TestXmlSax {public static void main(String[] args) {String path = "source/games.xml";String path2 = "source/games2.xml";//不带属性的XML sax 解析System.out.println("不带属性的XML sax 解析");List<Game> games = parserXml2(path);for (Game game : games) {System.out.println(game);}//带属性的XML sax 解析System.out.println("带属性的XML sax 解析");List<Game> list = parserXml3(path2);for (Game game : list) {System.out.println(game);}}public static void parserXml(String path) {try {// 使用SAXParserFactory创建SAX解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();// 通过SAX解析工厂得到解析器对象SAXParser parser = factory.newSAXParser();// 通过解析器对象得到一个XML的读取器XMLReader reader = parser.getXMLReader();// 设置读取器的事件处理器reader.setContentHandler(new MyHandler());// 解析xml文件reader.parse(path);} catch (Exception e) {e.printStackTrace();}}// 解析不带属性的XMLpublic static List<Game> parserXml2(String path) {List<Game> list = null;try {// 使用SAXParserFactory创建SAX解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();// 通过SAX解析工厂得到解析器对象SAXParser parser = factory.newSAXParser();// 通过解析器对象得到一个XML的读取器XMLReader reader = parser.getXMLReader();// 设置读取器的事件处理器MyHandler2 handler2 = new MyHandler2();reader.setContentHandler(handler2);// 解析// 解析xml文件reader.parse(path);list = handler2.getList();} catch (Exception e) {e.printStackTrace();}return list;}// 解析带属性的XMLpublic static List<Game> parserXml3(String path) {List<Game> list = null;try {// 使用SAXParserFactory创建SAX解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();// 通过SAX解析工厂得到解析器对象SAXParser parser = factory.newSAXParser();// 通过解析器对象得到一个XML的读取器XMLReader reader = parser.getXMLReader();// 设置读取器的事件处理器MyHandler3 handler3 = new MyHandler3();reader.setContentHandler(handler3);// 解析// 解析xml文件reader.parse(path);list = handler3.getList();} catch (Exception e) {e.printStackTrace();}return list;}}
下面是Game类:
package com.ctgu.sax;public class Game {private String id;private String name;private String company;public Game() {// TODO Auto-generated constructor stub}public Game(String id, String name, String company) {super();this.id = id;this.name = name;this.company = company;}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 getCompany() {return company;}public void setCompany(String company) {this.company = company;}@Overridepublic String toString() {return "Game [id=" + id + ", name=" + name + ", company=" + company + "]";}}
下面是自定的两个Handler类:
Handler2------不带属性的解析
package com.ctgu.sax;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;/*** 解析XML,返回List集合* @author MXN**/public class MyHandler2 extends DefaultHandler {private String tag = null;private List<Game> list = null;private Game g = null;// 开始文档@Overridepublic void startDocument() throws SAXException {// System.out.println("--------startDocument");list = new ArrayList<>();}// 结束文档@Overridepublic void endDocument() throws SAXException {//System.out.println("--------endDocument");//System.out.println(list);}// 开始标签@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//System.out.println("--------startElement uri=" + uri + " localName=" + localName + " qName=" + qName);tag = qName;if (qName.equals("game")) {g = new Game();}}// 结束标签@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {//System.out.println("--------endElement uri=" + uri + " localName=" + localName + " qName=" + qName);tag = "";if (qName.equals("game"))// 如果发现game的结束标签,说明一个game对象已经解释完成{list.add(g);}}// 读取标签里面的数据/*** ch 整个XML文档的字符数组 start 代表,当前标签所在字符在整个数组中的开始位置 length 代表 当前标签里面字符的长度*/@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {//System.out.println("--------characters");//System.out.println(tag);if (tag.equals("id")) {g.setId(new String(ch, start, length));// System.out.println(new String(ch, start, length));} else if (tag.equals("name")) {g.setName(new String(ch, start, length));// System.out.println(new String(ch, start, length));} else if (tag.equals("company")) {g.setCompany(new String(ch, start, length));// System.out.println(new String(ch, start, length));}}public List<Game> getList() {return list;}}
Handler3-------带属性的解析
package com.ctgu.sax;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;/** 解析带属性的XML*/public class MyHandler3 extends DefaultHandler {private String tag = null;private List<Game> list = null;private Game g = null;// 开始文档@Overridepublic void startDocument() throws SAXException {list = new ArrayList<>();}// 结束文档@Overridepublic void endDocument() throws SAXException {}// 开始标签@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {tag = qName;if (qName.equals("game")) {//System.out.println(attributes.getValue("id"));g = new Game();g.setId(attributes.getValue("id"));}}// 结束标签@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {tag = "";if (qName.equals("game"))// 如果发现game的结束标签,说明一个game对象已经解释完成{list.add(g);}}// 读取标签里面的数据/*** ch 整个XML文档的字符数组 start 代表,当前标签所在字符在整个数组中的开始位置 length 代表 当前标签里面字符的长度*/@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {if (tag.equals("name")) {g.setName(new String(ch, start, length));} else if (tag.equals("company")) {g.setCompany(new String(ch, start, length));}}public List<Game> getList() {return list;}}
这是最终的解析结果:
不带属性的XML sax 解析Game [id=1, name=完美国际2, company=完美世界]Game [id=2, name=LOL, company=Tencent]Game [id=3, name=DOTA, company=暴雪]带属性的XML sax 解析Game [id=1, name=完美国际2, company=完美世界]Game [id=2, name=LOL, company=Tencent]Game [id=3, name=DOTA, company=暴雪]
这篇关于XML解析之----SAX解析(带属性与不带属性)----自定义Handler类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!