当前位置: 代码迷 >> Android >> 安卓怎么获取xml中的元素数组
  详细解决方案

安卓怎么获取xml中的元素数组

热度:79   发布时间:2016-04-27 22:44:57.0
安卓如何获取xml中的元素数组?
xml文件在服务器,
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<music>
<song>
<id>1</id>
<title>Someone Like You</title>
<artist>Adele</artist>
<duration>4:47</duration>
<thumb_url>http://api.androidhive.info/music/images/adele.png</thumb_url>
</song>
<song>
<id>2</id>
<title>Space Bound</title>
<artist>Eminem</artist>
<duration>4:38</duration>
<thumb_url>
http://api.androidhive.info/music/images/eminem.png
</thumb_url>
</song>
<song>
<id>3</id>
<title>Stranger In Moscow</title>
<artist>Michael Jackson</artist>
<duration>5:44</duration>
<thumb_url>http://api.androidhive.info/music/images/mj.png</thumb_url>
</song>
<song>
<id>4</id>
<title>Love The Way You Lie</title>
<artist>Rihanna</artist>
<duration>4:23</duration>
<thumb_url>
http://api.androidhive.info/music/images/rihanna.png
</thumb_url>
</song>
<song>
<id>5</id>
<title>Khwaja Mere Khwaja</title>
<artist>A R Rehman</artist>
<duration>6:58</duration>
<thumb_url>
http://api.androidhive.info/music/images/arrehman.png
</thumb_url>
</song>
<song>
<id>6</id>
<title>All My Days</title>
<artist>Alexi Murdoch</artist>
<duration>4:47</duration>
<thumb_url>
http://api.androidhive.info/music/images/alexi_murdoch.png
</thumb_url>
</song>
<song>
<id>7</id>
<title>Life For Rent</title>
<artist>Dido</artist>
<duration>3:41</duration>
<thumb_url>http://api.androidhive.info/music/images/dido.png</thumb_url>
</song>
<song>
<id>8</id>
<title>Love To See You Cry</title>
<artist>Enrique Iglesias</artist>
<duration>4:07</duration>
<thumb_url>
http://api.androidhive.info/music/images/enrique.png
</thumb_url>
</song>
<song>
<id>9</id>
<title>The Good, The Bad And The Ugly</title>
<artist>Ennio Morricone</artist>
<duration>2:42</duration>
<thumb_url>http://api.androidhive.info/music/images/ennio.png</thumb_url>
</song>
<song>
<id>10</id>
<title>Show me the meaning</title>
<artist>Backstreet Boys</artist>
<duration>3:56</duration>
<thumb_url>
http://api.androidhive.info/music/images/backstreet_boys.png
</thumb_url>
</song>
<song>
<id>11</id>
<title>Someone Like You</title>
<artist>Adele</artist>
<duration>4:47</duration>
<thumb_url>http://api.androidhive.info/music/images/adele.png</thumb_url>
</song>
<song>
<id>12</id>
<title>Space Bound</title>
<artist>Eminem</artist>
<duration>4:38</duration>
<thumb_url>
http://api.androidhive.info/music/images/eminem.png
</thumb_url>
</song>
<song>
<id>13</id>
<title>Stranger In Moscow</title>
<artist>Michael Jackson</artist>
<duration>5:44</duration>
<thumb_url>http://api.androidhive.info/music/images/mj.png</thumb_url>
</song>
<song>
<id>14</id>
<title>Love The Way You Lie</title>
<artist>Rihanna</artist>
<duration>4:23</duration>
<thumb_url>
http://api.androidhive.info/music/images/rihanna.png
</thumb_url>
</song>
<song>
<id>15</id>
<title>Khwaja Mere Khwaja</title>
<artist>A R Rehman</artist>
<duration>6:58</duration>
<thumb_url>
http://api.androidhive.info/music/images/arrehman.png
</thumb_url>
</song>
<song>
<id>16</id>
<title>All My Days</title>
<artist>Alexi Murdoch</artist>
<duration>4:47</duration>
<thumb_url>
http://api.androidhive.info/music/images/alexi_murdoch.png
</thumb_url>
</song>
<song>
<id>17</id>
<title>Life For Rent</title>
<artist>Dido</artist>
<duration>3:41</duration>
<thumb_url>http://api.androidhive.info/music/images/dido.png</thumb_url>
</song>
<song>
<id>18</id>
<title>Love To See You Cry</title>
<artist>Enrique Iglesias</artist>
<duration>4:07</duration>
<thumb_url>
http://api.androidhive.info/music/images/enrique.png
</thumb_url>
</song>
<song>
<id>19</id>
<title>The Good, The Bad And The Ugly</title>
<artist>Ennio Morricone</artist>
<duration>2:42</duration>
<thumb_url>http://api.androidhive.info/music/images/ennio.png</thumb_url>
</song>
<song>
<id>20</id>
<title>Show me the meaning</title>
<artist>Backstreet Boys</artist>
<duration>3:56</duration>
<thumb_url>
http://api.androidhive.info/music/images/backstreet_boys.png
</thumb_url>
</song>
<song>
<id>21</id>
<title>Someone Like You</title>
<artist>Adele</artist>
<duration>4:47</duration>
<thumb_url>http://api.androidhive.info/music/images/adele.png</thumb_url>
</song>
<song>
<id>22</id>
<title>Space Bound</title>
<artist>Eminem</artist>
<duration>4:38</duration>
<thumb_url>
http://api.androidhive.info/music/images/eminem.png
</thumb_url>
</song>
<song>
<id>23</id>
<title>Stranger In Moscow</title>
<artist>Michael Jackson</artist>
<duration>5:44</duration>
<thumb_url>http://api.androidhive.info/music/images/mj.png</thumb_url>
</song>
<song>
<id>24</id>
<title>Love The Way You Lie</title>
<artist>Rihanna</artist>
<duration>4:23</duration>
<thumb_url>
http://api.androidhive.info/music/images/rihanna.png
</thumb_url>
</song>
<song>
<id>25</id>
<title>Khwaja Mere Khwaja</title>
<artist>A R Rehman</artist>
<duration>6:58</duration>
<thumb_url>
http://api.androidhive.info/music/images/arrehman.png
</thumb_url>
</song>
<song>
<id>26</id>
<title>All My Days</title>
<artist>Alexi Murdoch</artist>
<duration>4:47</duration>
<thumb_url>
http://api.androidhive.info/music/images/alexi_murdoch.png
</thumb_url>
</song>
<song>
<id>27</id>
<title>Life For Rent</title>
<artist>Dido</artist>
<duration>3:41</duration>
<thumb_url>http://api.androidhive.info/music/images/dido.png</thumb_url>
</song>
<song>
<id>28</id>
<title>Love To See You Cry</title>
<artist>Enrique Iglesias</artist>
<duration>4:07</duration>
<thumb_url>
http://api.androidhive.info/music/images/enrique.png
</thumb_url>
</song>
<song>
<id>29</id>
<title>The Good, The Bad And The Ugly</title>
<artist>Ennio Morricone</artist>
<duration>2:42</duration>
<thumb_url>http://api.androidhive.info/music/images/ennio.png</thumb_url>
</song>
<song>
<id>30</id>
<title>Show me the meaning</title>
<artist>Backstreet Boys</artist>
<duration>3:56</duration>
<thumb_url>
http://api.androidhive.info/music/images/backstreet_boys.png
</thumb_url>
</song>
</music>
安卓获取<thumb_url></thumb_url>中的元素数组怎么写?
------解决思路----------------------
1:首先,定义实体类Song
package com.example.androiddemo;

public class Song {

String id;
String title;
String artist;
String duration;
String thumb_url;

@Override
public String toString() {
return "id="+id+",title="+title+",artist="+artist+",duration="+duration+",thumb_url="+thumb_url;
}

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getThumb_url() {
return thumb_url;
}
public void setThumb_url(String thumb_url) {
this.thumb_url = thumb_url;
}


}

2:定义接口
package com.example.androiddemo;

import java.io.InputStream;
import java.util.List;

public interface RootParser {

/**
 * 解析输入流
 * @param stream
 * @return
 * @throws Exception
 */
public List<Song> parse(InputStream stream)throws Exception;

/**
 * 序列化Song对象
 * @param song
 * @return
 * @throws Exception
 */
public String serialize(List<Song> song)throws Exception;

}

3:具体实现接口
package com.example.androiddemo;

import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;

public class SongParser implements RootParser{

@Override
public List<Song> parse(InputStream stream) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();//取得SAXParserFactory实例  
        SAXParser parser = factory.newSAXParser();//从factory获取SAXParser实例  
        MyHandler handler = new MyHandler();//实例化自定义Handler  
        parser.parse(stream, handler);//根据自定义Handler规则解析输入流
        return handler.getSong();
}

@Override
public String serialize(List<Song> song) throws Exception {
SAXTransformerFactory factory = (SAXTransformerFactory) TransformerFactory.newInstance();//取得SAXTransformerFactory实例
TransformerHandler handler = factory.newTransformerHandler();//从factory获取TransformerHandler实例
Transformer transformer = handler.getTransformer();//从handler获取Transformer实例
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");// 设置输出采用的编码方式
transformer.setOutputProperty(OutputKeys.INDENT, "yes");// 是否自动添加额外的空白
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");// 是否忽略XML声明  

StringWriter writer = new StringWriter();  
        Result result = new StreamResult(writer);  
        handler.setResult(result);
        
        String uri = "";    //代表命名空间的URI 当URI无值时 须置为空字符串  
        String localName = "";  //命名空间的本地名称(不包含前缀) 当没有进行命名空间处理时 须置为空字符串
        
        handler.startDocument();  
        handler.startElement(uri, localName, "music", null);
        
        AttributesImpl attrs = new AttributesImpl();    //负责存放元素的属性信息
        char[] ch = null;
        for(Song singleSong:song){
         attrs.clear();  //清空属性列表
         attrs.addAttribute(uri, localName, "id", "string", singleSong.getId());//添加一个名为id的属性
        
         handler.startElement(uri, localName, "song", attrs);    //开始一个song元素 关联上面设定的id属性
        
         handler.startElement(uri, localName, "title", null); //开始一个title元素 没有属性  
         ch = singleSong.getTitle().toCharArray();
         handler.characters(ch, 0, ch.length);   //设置title元素的文本节点
         handler.endElement(uri, localName, "title"); 
        
         handler.startElement(uri, localName, "artist", null); //开始一个artist元素 没有属性  
         ch = singleSong.getTitle().toCharArray();
         handler.characters(ch, 0, ch.length);   //设置artist元素的文本节点
         handler.endElement(uri, localName, "artist"); 
        
         handler.startElement(uri, localName, "duration", null); //开始一个duration元素 没有属性  
         ch = singleSong.getTitle().toCharArray();
         handler.characters(ch, 0, ch.length);   //设置duration元素的文本节点
         handler.endElement(uri, localName, "duration"); 
        
         handler.startElement(uri, localName, "thumb_url", null); //开始一个thumb_url元素 没有属性  
         ch = singleSong.getTitle().toCharArray();
         handler.characters(ch, 0, ch.length);   //设置thumb_url元素的文本节点
         handler.endElement(uri, localName, "thumb_url"); 
        
        }
        handler.endElement(uri, localName, "music");
        handler.endDocument(); 
return writer.toString();
}

/**
 * 需要重写DefaultHandler的方法 
 * @author luosiye
 *
 */
private class MyHandler extends DefaultHandler {

private List<Song> songs;
private Song song;
private StringBuilder builder;

public List<Song> getSong(){
return songs;
}

@Override
public void startDocument() throws SAXException {
super.startDocument();
songs = new ArrayList<Song>();
builder = new StringBuilder();
}

@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (localName.equals("song")) {  
song = new Song();  
            }  
builder.setLength(0);//将字符长度设置为0 以便重新开始读取元素内的字符节点
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
builder.append(ch, start, length);  //将读取的字符数组追加到builder中
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if (localName.equals("id")) {
song.setId(builder.toString());
}else if(localName.equals("title")){
song.setTitle(builder.toString());
}else if(localName.equals("artist")){
song.setArtist(builder.toString());
}else if(localName.equals("duration")){
song.setDuration(builder.toString());
}else if(localName.equals("thumb_url")){
song.setThumb_url(builder.toString());
}else if(localName.equals("song")){
songs.add(song);
}
}

}

}

4:实现调用
package com.example.androiddemo;

import java.io.InputStream;
import java.util.List;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

private SongParser parser;
private List<Song> songs;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

try {
InputStream is = getAssets().open("song.xml");
parser = new SongParser();
songs = parser.parse(is);
for(Song song:songs){
System.out.println(song.toString());
}
} catch (Exception e) {
e.printStackTrace();


}

}

运行结果:


song.xml文件就是你上面的文件
  相关解决方案