XML解析——SAX方式

本文介绍了使用SAX方式解析XML的过程,包括创建ContentHandler子类并重写startDocument、startElement、characters、endElement和endDocument方法。通过示例代码展示了XML解析的步骤,并提供了运行后的效果。文章还提到了加载XML资源的方法。

首先准备了一个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;
	}
	@Override
	public 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;
	}

	@Override
	public void startDocument() throws SAXException {
		//在文档开始的时候建立集合
		stars = new ArrayList<Star>();
	}

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

	}

	@Override
	public void characters(char[] ch, int start, int length) {
		//获取到节点的内容
		content = new String(ch, start, length);

	}

	@Override
	public 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;
		}
	}

	@Override
	public 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设置Handler
			reader.setContentHandler(handler);
			//开始解析stars.xml
			reader.parse(new InputSource(UtilPullXml.class.getClassLoader()
					.getResourceAsStream("stars.xml")));

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.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")







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值