package com.wyt.MP3player;import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;import android.app.ListActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;import com.wyt.download.HttpDownloader;
import com.wyt.model.MP3info;
import com.wyt.xml.Mp3ListContentHandler;public class MP3ListActivity extends ListActivity { //创建常量
private static final int UPDATE = 1;
private static final int ABOUT = 2; //点击menu后会调用该方法,在此方法中添加需要的控件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub //添加按钮(更新,关于)
menu.add(0, UPDATE, 1, R.string.mp3List_update);
menu.add(0, ABOUT, 2, R.string.mp3List_about); return super.onCreateOptionsMenu(menu);
} /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
} //当点击任意一个按钮时显示的列表
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//判断得到的按钮号,并做出相应的动作
//点击的是更新按钮
if (item.getItemId() == UPDATE) { //传入本机的地址
String xml = downloadXML("http://10.10.16.97:8080/MP3/resources.xml");
System.out.println("!!!!!!!!!!!1");
parseXml(xml);
System.out.println("########");
//点击的是关于按钮
} else if (item.getItemId() == ABOUT) { }
return super.onOptionsItemSelected(item);
} //调用下载类
private String downloadXML(String urlStr) {
//创建Download对象
HttpDownloader download = new HttpDownloader();
//得到本机的URL地址
String result = download.download(urlStr); return result;
} //解析xml文件
private List<MP3info> parseXml(String xmlStr) {
// 创建一个新的字符串
  StringReader read = new StringReader(xmlStr);
  // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
  InputSource source = new InputSource(read); try {
//创建xml解析器
SAXParserFactory sax = SAXParserFactory.newInstance();
// SAXParser sp = sax.newSAXParser();
// XMLReader xr = sp.getXMLReader();
XMLReader xmlReader = sax.newSAXParser().getXMLReader();

List<MP3info> info = new ArrayList<MP3info>();
Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(
info);
//为xmlread设置内容处理器
xmlReader.setContentHandler(mp3ListContentHandler);

//开始解析文件
xmlReader.parse(source);
//parse(new InputSource(new StringReader(xmlStr)));
System.out.println("@@@@@@@@@@@@@@@@@@@@2");
//循环输出解析内容
for (Iterator iterator = info.iterator(); iterator.hasNext();) {
MP3info mp3info = (MP3info) iterator.next();
System.out.println("***"+mp3info);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}}package com.wyt.xml;import java.util.List;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import com.wyt.model.MP3info;public class Mp3ListContentHandler extends DefaultHandler{ private List<MP3info> info=null;
private MP3info mp3info=null;
private String tagName=null;

public Mp3ListContentHandler(List<MP3info> info) {
super();
this.info = info;
} public List<MP3info> getInfo() {
return info;
} public void setInfo(List<MP3info> info) {
this.info = info;
} //在xml文件中,若遇到某个指定标签就将该文件内容写入到MP3info中
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String temp=new String(ch,start,length);
if(tagName.equals("id")){
mp3info.setId(temp);
}else if(tagName.equals("mp3_name")){
mp3info.setMp3Name(temp);
}else if(tagName.equals("mp3_size")){
mp3info.setMp3Size(temp);
}else if(tagName.equals("lrc_name")){
mp3info.setLrcName(temp);
}else if(tagName.equals("lrc_size")){
mp3info.setLrcSize(temp);
}
} @Override
public void endDocument() throws SAXException {

}
//在结束时,将在xml中读到的数据放到List中
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if(name.equals("resource")){
info.add(mp3info);
}
System.out.println("%%%%%%%%%%%%"); 
tagName=""; 
} @Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
} //在开始的时候,一遇到resource就生成MP3info对象
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
this.tagName=localName;

//遇到"resource"就生成一个MP3info对象
if(tagName.equals("resource")){
mp3info=new MP3info();
}
}}
警告:
06-02 13:17:16.006: WARN/KeyCharacterMap(889): No keyboard for id 0
06-02 13:17:16.006: WARN/KeyCharacterMap(889): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
06-02 13:17:17.045: INFO/global(889): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
06-02 13:17:17.074: WARN/System.err(889): org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 104: mismatched tag
06-02 13:17:17.086: WARN/System.err(889):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:507)
06-02 13:17:17.086: WARN/System.err(889):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492)
06-02 13:17:17.094: WARN/System.err(889):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308)
06-02 13:17:17.094: WARN/System.err(889):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264)
06-02 13:17:17.105: WARN/System.err(889):     at com.wyt.MP3player.MP3ListActivity.parseXml(MP3ListActivity.java:97)
06-02 13:17:17.114: WARN/System.err(889):     at com.wyt.MP3player.MP3ListActivity.onOptionsItemSelected(MP3ListActivity.java:57)
06-02 13:17:17.114: WARN/System.err(889):     at android.app.Activity.onMenuItemSelected(Activity.java:2195)
06-02 13:17:17.114: WARN/System.err(889):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730)
06-02 13:17:17.114: WARN/System.err(889):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
06-02 13:17:17.126: WARN/System.err(889):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
06-02 13:17:17.126: WARN/System.err(889):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
06-02 13:17:17.126: WARN/System.err(889):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
06-02 13:17:17.135: WARN/System.err(889):     at android.view.View$PerformClick.run(View.java:8816)
06-02 13:17:17.135: WARN/System.err(889):     at android.os.Handler.handleCallback(Handler.java:587)
06-02 13:17:17.145: WARN/System.err(889):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-02 13:17:17.145: WARN/System.err(889):     at android.os.Looper.loop(Looper.java:123)
06-02 13:17:17.154: WARN/System.err(889):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 13:17:17.154: WARN/System.err(889):     at java.lang.reflect.Method.invokeNative(Native Method)
06-02 13:17:17.166: WARN/System.err(889):     at java.lang.reflect.Method.invoke(Method.java:521)
06-02 13:17:17.166: WARN/System.err(889):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 13:17:17.166: WARN/System.err(889):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 13:17:17.176: WARN/System.err(889):     at dalvik.system.NativeStart.main(Native Method)
06-02 13:17:17.256: WARN/InputManagerService(59): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4504a6d8