首先准备了一个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 + "]";
}
}
首先创建一个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")
本文介绍了使用SAX方式解析XML的过程,包括创建ContentHandler子类并重写startDocument、startElement、characters、endElement和endDocument方法。通过示例代码展示了XML解析的步骤,并提供了运行后的效果。文章还提到了加载XML资源的方法。
4145

被折叠的 条评论
为什么被折叠?



