1、要解析的xml文件如下
<?xml version="1.0" encoding="ISO-8859-1" ?>
<resources>
<resource>
<id>001</id>
<mp3.name>a1.mp3</mp3.name>
<mp3.size>22343</mp3.size>
<lrc.name>a1.lrc</lrc.name>
<lrc.size>3232</lrc.name>
</resource>
<resource>
<id>002</id>
<mp3.name>a2.mp3</mp3.name>
<mp3.size>343434/mp3.size>
<lrc.name>a2..lrc</lrc.name>
<lrc.size>4534</lrc.name>
</resource>
</resources>
2、创建一个实体类package paj.Model;
publicclass Mp3info {
private String id;
private String mp3Name;
private String mp3Size;
private String lrcName;
public Mp3info() {
super();
}
public Mp3info(String id, String mp3Name, String mp3Size, String lrcName,
String lrcSize){
super();
this.id = id;
this.mp3Name = mp3Name;
this.mp3Size = mp3Size;
this.lrcName = lrcName;
this.lrcSize = lrcSize;
}
public String getId() {
return id;
}
publicvoid setId(Stringid) {
this.id = id;
}
public String getMp3Name() {
return mp3Name;
}
publicvoidsetMp3Name(String mp3Name) {
this.mp3Name = mp3Name;
}
public String getMp3Size() {
return mp3Size;
}
publicvoid setMp3Size(Stringmp3Size) {
this.mp3Size = mp3Size;
}
public String getLrcName() {
return lrcName;
}
publicvoidsetLrcName(String lrcName) {
this.lrcName = lrcName;
}
public String getLrcSize() {
return lrcSize;
}
publicvoid setLrcSize(StringlrcSize) {
this.lrcSize = lrcSize;
}
private String lrcSize;
@Override
public String toString() {
return"Mp3info [id=" + id + ", mp3Name=" + mp3Name + ",mp3Size="
+ mp3Size + ",lrcName=" + lrcName + ",lrcSize=" + lrcSize
+ "]";
}
} 3、创建一个类继承DefaultHandler来实现DefaultHandler中的方法
package paj.xml;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import paj.Model.Mp3info;
publicclassMp3ListContentHandle extends DefaultHandler {
//Mp3info是一个实体类,包含get set方法
private List<Mp3info> infos = null;
private Mp3info mp3info = null;
private String tagName = null;
public List<Mp3info> getInfos() {
return infos;
}
publicvoidsetInfos(List<Mp3info> infos) {
this.infos = infos;
}
public Mp3ListContentHandle(List<Mp3info> infos) {
super();
this.infos = infos;
}
/*** characters得到标签中间的值
* 第一个参数 XMLReader把标签中的值放到char[]类型的ch数组变量中
* 第二个参数 ch对象中从第几位开始是读取到得值
* 第三个参数 ch对象中值的结束为止,即值的长度。
* 使用new String(ch ,start , length)可以得到一个值的字符串。直接赋值给String类型变量
*/
@Override
publicvoid characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String temp = new String(ch , start , length);
if(tagName.equals("id")){
mp3info.setId(temp);
}
if(tagName.equals("mp3.name")){
mp3info.setMp3Name(temp);
}
if(tagName.equals("mp3.size")){
mp3info.setMp3Size(temp);
}
if(tagName.equals("lrc.name")){
mp3info.setLrcName(temp);
}
if(tagName.equals("lrc.size")){
mp3info.setLrcSize(temp);
}
}
/*** 文档解析完后触发
*
*/
@Override
publicvoid endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
/*** 解析标签结束后触发
*
*/
@Override
publicvoidendElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if(localName.equals("resource")){
infos.add(mp3info);
System.out.println("------------>");
}
tagName = "";
}
/***
* 开始解析文档时触发
*/
@Override
publicvoid startDocument()throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
/*** 开始解析标签
* 第一个参数 uri 是指当前正在解析的标签的命名空间
* 第二个参数localName 没有前缀的标签:例:<user:name>得到的localName是:name
* 第三个参数qName 带前缀标签例:<user:name> 得到的qName是:user:name
* 第四个参数attributes 得到标签中所有属性 <nameid="1" sex="男">xxx</name>得到的attributes是 id="1" sex="男"
*
* 如何获取属性的名字和值:
* arrributes类似于数组,可以使用循环来读取attributes中的值
* 获取属性的名字:attributes.getLocalName();
* 获取属性的值:attributes.getValue();
* 例:
* for(int i = 0; i<attributes.length(); i++){
* System.out.println("属性名:"+attributes.getLocalName(i) + "属性值:" +attributes.getValue(i));
* }
*
*
*/
@Override
publicvoidstartElement(String uri, String localName, String qName,
Attributesattributes) throws SAXException {
// TODO Auto-generated method stub
this.tagName = localName;
if(tagName.equals("resource")){
mp3info = new Mp3info();
}
}
}
4、开始解析xml文档
/***
* 解析XML文档
* @param xmlStr XML文档中的所有内容
* @return
*/
private List<Mp3info> parse(String xmlStr){
//创建一个SAXParseFactory解析器的工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
List<Mp3info>infosList = new ArrayList<Mp3info>();
try {
//创建得到一个XMLReader对象
XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
//实例化处理函数类
Mp3ListContentHandlemp3ListContentHandle = new Mp3ListContentHandle(infosList);
//为XMLReader设置内容处理器,mp3ListContentHandle就是在处理XML时所需要触发的函数
xmlReader.setContentHandler(mp3ListContentHandle);
//开始解析XML,parse接收的是InputSource类型的。使用new InputSource(new StringReader(xmlStr))转换成InputSource
xmlReader.parse(new InputSource(new StringReader(xmlStr)));
for (Iterator iterator = infosList.iterator(); iterator.hasNext();) {
Mp3info mp3info= (Mp3info) iterator.next();
//System.out.println(mp3info);
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return infosList;
}