android sax解析器只显示TextView中的第一行

时间:2012-07-05 22:12:12

标签: android xml parsing textview sax

我正在使用android和java开发我的第一个项目 而且经验很少。 我有一个无线电播放器(启动和停止按钮,激活服务) 和 来自xml文件的一些数据,如艺术家标题和在textview中加载的相册 我使用一个计时器,以便gui更新播放的歌曲

这一切都有效 只有在文本视图中加载歌词时,它才会显示xml标记的第一行<LYRIC>

这是我的主要活动:

extends  Activity implements OnClickListener{

     private static final String TAG = "ServicesDemo";
     public String myimageURL;
     private EditText Lyrics;
    private ImageView AlbumPic;
    private Button play,  stop;
    private TextView Artist, Song, Album, News, Lyric;
    private UpdateTimeTask m_updateTime;
    private Handler m_handler;
    Parser data;
    /** The delay in milliseconds between updates. */
    private final int DELAY = 20000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Artist =(TextView)findViewById(R.id.tvArtist);
        Song  =(TextView)findViewById(R.id.tvSongTitle);
        Album =(TextView)findViewById(R.id.tvAlbum);
        play = (Button) findViewById(R.id.play);
        stop = (Button) findViewById(R.id.stop);
        Lyrics = (EditText) findViewById(R.id.tvLyrics);
        News = (TextView)findViewById(R.id.tvAnouncement);
        AlbumPic = (ImageView) findViewById(R.id.AlbumPic);



        play.setOnClickListener(this);
        stop.setOnClickListener(this);



        m_updateTime = new UpdateTimeTask();

        m_handler = new Handler();
        m_handler.post(m_updateTime);
    }

    private class UpdateTimeTask implements Runnable {
        public void run() {


            try {

                SAXParserFactory saxPF = SAXParserFactory.newInstance();
                SAXParser saxP = saxPF.newSAXParser();
                XMLReader xmlR = saxP.getXMLReader();


                URL url = new URL("http://www.mysite.com/AndroidTest.php"); 
                XMLHandler myXMLHandler = new XMLHandler();
                xmlR.setContentHandler(myXMLHandler);
                xmlR.parse(new InputSource(url.openStream()));

            } catch (Exception e) {
                System.out.println(e);
            }
            data = XMLHandler.data;



            for (int i = 0; i < data.getTitle().size(); i++) {

           Lyrics.setText(data.getLyric().get(i));
                 myimageURL = data.getPic().get(i);

            Song.setText("Title = "+data.getTitle().get(i));


            Artist.setText("Artist = "+data.getArtist().get(i));


            Album.setText("Album = "+data.getAlbum().get(i)); 






 }

 downloadFile(myimageURL );

}

Bitmap bmImg;
void downloadFile(String fileUrl) {
 URL myFileUrl = null;
 try {
    myFileUrl = new URL(fileUrl);
 } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
 }
 try {
    HttpURLConnection conn = (HttpURLConnection) myFileUrl
          .openConnection();
    conn.setDoInput(true);
    conn.connect();
    InputStream is = conn.getInputStream();

    bmImg = BitmapFactory.decodeStream(is);
    AlbumPic.setImageBitmap(bmImg);
 } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
 }
 m_handler.postDelayed(m_updateTime, DELAY);
 AlbumPic.clearAnimation();
}

}

extends Activity implements OnClickListener{ private static final String TAG = "ServicesDemo"; public String myimageURL; private EditText Lyrics; private ImageView AlbumPic; private Button play, stop; private TextView Artist, Song, Album, News, Lyric; private UpdateTimeTask m_updateTime; private Handler m_handler; Parser data; /** The delay in milliseconds between updates. */ private final int DELAY = 20000; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Artist =(TextView)findViewById(R.id.tvArtist); Song =(TextView)findViewById(R.id.tvSongTitle); Album =(TextView)findViewById(R.id.tvAlbum); play = (Button) findViewById(R.id.play); stop = (Button) findViewById(R.id.stop); Lyrics = (EditText) findViewById(R.id.tvLyrics); News = (TextView)findViewById(R.id.tvAnouncement); AlbumPic = (ImageView) findViewById(R.id.AlbumPic); play.setOnClickListener(this); stop.setOnClickListener(this); m_updateTime = new UpdateTimeTask(); m_handler = new Handler(); m_handler.post(m_updateTime); } private class UpdateTimeTask implements Runnable { public void run() { try { SAXParserFactory saxPF = SAXParserFactory.newInstance(); SAXParser saxP = saxPF.newSAXParser(); XMLReader xmlR = saxP.getXMLReader(); URL url = new URL("http://www.mysite.com/AndroidTest.php"); XMLHandler myXMLHandler = new XMLHandler(); xmlR.setContentHandler(myXMLHandler); xmlR.parse(new InputSource(url.openStream())); } catch (Exception e) { System.out.println(e); } data = XMLHandler.data; for (int i = 0; i < data.getTitle().size(); i++) { Lyrics.setText(data.getLyric().get(i)); myimageURL = data.getPic().get(i); Song.setText("Title = "+data.getTitle().get(i)); Artist.setText("Artist = "+data.getArtist().get(i)); Album.setText("Album = "+data.getAlbum().get(i)); } downloadFile(myimageURL ); } Bitmap bmImg; void downloadFile(String fileUrl) { URL myFileUrl = null; try { myFileUrl = new URL(fileUrl); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { HttpURLConnection conn = (HttpURLConnection) myFileUrl .openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bmImg = BitmapFactory.decodeStream(is); AlbumPic.setImageBitmap(bmImg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } m_handler.postDelayed(m_updateTime, DELAY); AlbumPic.clearAnimation(); } }

我的xml代码

我还尝试使用edittext加载歌词,但它也只显示<?xml version="1.0"?> <CATALOG> <CD> <LYRIC>Stop that train: I'm leavin' - today! Stop that train: I'm leavin' - anyway! Stop that train: I'm leavin'. and I said: It won't be too long whether I'm right or wrong; I said, it won't be too long whether I'm right or wrong. All my good life I've been a lonely man, Teachin' my people who don't understand; And even though I tried my best, I still can't find no happiness. So I got to say: Stop that train: I'm leavin' - oh, baby now! Stop that train: I'm leavin' - don't care what you say! Stop that train: I'm leavin'. and I said: It won't be too long whether I'm right or wrong; Said, it won't be too long whether I'm right or wrong. Some goin' east; and-a some goin' west, Some stand aside to try their best. Some livin' big, but the most is livin' small: They just can't even find no food at all. I mean, stop it: Stop that train: I'm leavin' - leavin', mm-hmm. Stop that train: I'm leavin' - I don't mind! Stop that train: I'm leavin'. and I said: It won't be too long whether I'm right or wrong; I said it won't be too long whether I'm right or wrong. Stop that train: I'm leavin' - leavin'! Stop that train: I'm leavin' - can't take it! Stop that train: I'm leavin' - got to be better! It won't be too long whether I'm right or wrong; I said it won't be too long whether I'm right or wrong.</LYRIC> <ARTIST>Bob Marley</ARTIST> <TITLE>Stop That Train</TITLE> <ALBUM>Talkin blues</ALBUM> <PIC>http://www.mysite.com/Android/Radio/AlbumCovers/Bob-Marley-Talkin-blues.jpg</PIC> </CD> </CATALOG> 标记的第一行

有人可以提供一些建议如何在textview中显示整个文本

感谢

我的xmlhandler

<LYRIC>

1 个答案:

答案 0 :(得分:0)

我建议你检查一下XMLHandler对象。我怀疑你有什么问题。

如果您能向我们展示最适合您的XMLHandler课程。

修改

我对您的处理程序进行了一些更改。我想你在阅读元素值时可能会遇到问题。请改用CharArrayWriter(我已经解决了相同的问题)。 而且我认为你也不需要'elementOn'。如果它是一个非必要的变量,就不要使用它。 确保在XML布局上定义了多个TextView。 希望它有效: - )

public class XMLHandler extends DefaultHandler {

    private static final String TAG = "XMLHandler";
    private String elementValue = null;
    public static Parser data = null;

    /** The contents. */
    private CharArrayWriter contents = new CharArrayWriter();

    public static Parser getXMLData() {
        return data;
    }

    public static void setXMLData(Parser data) {
        XMLHandler.data = data;
    }

    /** 
     * This will be called when the tags of the XML starts.
     **/
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {

        /**It´s a good practice to reset the CharArrayWriter when you start any element.*/
        contents.reset();

        if (localName.equals("CATALOG"))
        {
            data = new Parser();
        } else if (localName.equals("CD")) {
            /** 
             * We can get the values of attributes for eg. if the CD tag had an attribute( <CD attr= "band">Akon</CD> ) 
             * we can get the value "band". Below is an example of how to achieve this.
             * 
             * String attributeValue = attributes.getValue("attr");
             * data.setAttribute(attributeValue);
             * 
             * */
        }
    }

    /** 
     * This will be called when the tags of the XML end.
     **/
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        /** 
         * Sets the values after retrieving the values from the XML tags
         * */ 
         String elementValue = contents.toString().trim();

        if (localName.equalsIgnoreCase("title"))
            data.setTitle(elementValue);
        else if (localName.equalsIgnoreCase("artist"))
            data.setArtist(elementValue);
        else if (localName.equalsIgnoreCase("album"))
            data.setAlbum(elementValue);
        else if (localName.equalsIgnoreCase("lyric"))
            data.setLyric(elementValue);
        else if (localName.equalsIgnoreCase("pic"))
            data.setPic(elementValue);
    }

    /** 
     * This is called to get the tags value
     **/
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
            contents.write(ch, start, length);
    }

    @Override
    public void endDocument() throws SAXException {
        Log.i(TAG, "Catalog parse finalized with success.");
    }
}