XML解析——SAX方式

来源:互联网 发布:游戏狗软件 编辑:程序博客网 时间:2024/05/22 10:50

首先准备了一个xml文件

<stars><star id="1"><name>Kobe</name><team>Lakers</team><position>Shooting Guard</position></star><star id="2"><name>Curry</name><team>Warriors</team><position>Point Guard</position></star><star id="3"><name>Durant</name><team>Thunder</team><position>Small Forward</position></star></stars>

java Star实体

public class Star {private String mId;private String mName;private String mPosition;private String mTeam;public String getId() {return mId;}public void setId(String id) {mId = id;}public String getName() {return mName;}public void setName(String name) {mName = name;}public String getPosition() {return mPosition;}public void setPosition(String position) {mPosition = position;}public String getTeam() {return mTeam;}public void setTeam(String team) {mTeam = team;}@Overridepublic String toString() {return "Star [mId=" + mId + ", mName=" + mName + ", mPosition="+ mPosition + ", mTeam=" + mTeam + "]";}}


接下来开始准备xml的解析

首先创建一个ContentHandler类继承DefaultHandler,并且重写他的五个方法


1、startDocument   //在文档开始时调用

2、startElement      //在开始解析某个节点开始时调用

3、characters         //获取节点中的内容时调用

4、endElement      // 完成某个节点的解析时调用

5、endDocument   //完成整个文档解析时调用


具体代码


public class ContentHandler extends DefaultHandler {private ArrayList<Star> stars;private String content;Star star = null;public ArrayList<Star> getStars() {return stars;}@Overridepublic void startDocument() throws SAXException {//在文档开始的时候建立集合stars = new ArrayList<Star>();}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {//如果开始的节点是star的话,就new一个Star对象,并获取到这个节点的属性id的值if ("star".equals(qName)) {star = new Star();star.setId(attributes.getValue(0));}}@Overridepublic void characters(char[] ch, int start, int length) {//获取到节点的内容content = new String(ch, start, length);}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {//节点结束时调用//如果是name,team,position,就赋值if ("name".equals(qName)) {star.setName(content);} else if ("team".equals(qName)) {star.setTeam(content);} else if ("position".equals(qName)) {star.setPosition(content);//如果是star节点的结束,就将star实例加入到集合中,并将star=null} else if ("star".equals(qName)) {stars.add(star);star = null;}}@Overridepublic void endDocument() throws SAXException {}}



解析过程如图所示



解析工具已经准备好了,开始解析(解释见代码注释)

<span style="font-size:14px;">public class UtilPullXml {public static ArrayList<Star> getStars() {//创建ContentHandler对象ContentHandler handler = new ContentHandler();// 创建一个转换工厂SAXParserFactory factory = SAXParserFactory.newInstance();try {//通过工厂new一个SAXparser对象SAXParser parser = factory.newSAXParser();//获得到XMLreader对象XMLReader reader = parser.getXMLReader();//为XMLreader设置Handlerreader.setContentHandler(handler);//开始解析stars.xmlreader.parse(new InputSource(UtilPullXml.class.getClassLoader().getResourceAsStream("stars.xml")));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//调用Content的getStars方法返回解析到的ArrayList<Star>数据return handler.getStars();}public static void main(String[] args) {ArrayList<Star> stars = getStars();//输出for (Star star : stars) {System.out.println(star);}}}</span>


运行后就可得到解析过的xml数据




tips:

加载资源的方法


UtilPullXml.class.getClassLoader().getResourceAsStream("stars.xml")







0 0
原创粉丝点击