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> 1.创建一个实体类 package paj.Model; public class 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; } public void setId(String id) { this.id = id; } public String getMp3Name() { return mp3Name; } public void setMp3Name(String mp3Name) { this.mp3Name = mp3Name; } public String getMp3Size() { return mp3Size; } public void setMp3Size(String mp3Size) { this.mp3Size = mp3Size; } public String getLrcName() { return lrcName; } public void setLrcName(String lrcName) { this.lrcName = lrcName; } public String getLrcSize() { return lrcSize; } public void setLrcSize(String lrcSize) { this.lrcSize = lrcSize; } private String lrcSize; @Override public String toString() { return "Mp3info [id=" + id + ", mp3Name=" + mp3Name + ", mp3Size=" + mp3Size + ", lrcName=" + lrcName + ", lrcSize=" + lrcSize + "]"; } } 2.创建一个类继承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; public class Mp3ListContentHandle extends DefaultHandler { //Mp3info是一个实体类,包含get set方法 private List<Mp3info> infos = null; private Mp3info mp3info = null; private String tagName = null; public List<Mp3info> getInfos() { return infos; } public void setInfos(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 public void 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 public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); } /*** 解析标签结束后触发 * */ @Override public void endElement(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 public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); } /*** 开始解析标签 * 第一个参数 uri 是指当前正在解析的标签的命名空间 * 第二个参数localName 没有前缀的标签:例:<user:name> 得到的localName是:name * 第三个参数qName 带前缀标签 例:<user:name> 得到的qName是:user:name * 第四个参数attributes 得到标签中所有属性 <name id="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 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub this.tagName = localName; if(tagName.equals("resource")){ mp3info = new Mp3info(); } } } 3.开始解析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(); //实例化处理函数类 Mp3ListContentHandle mp3ListContentHandle = 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; }