android SaxParser 解析url失败.android SaxParser如何解析url

文章标签: android,android-saxparser
2015-1-14 9:22:43     人阅读    

android SaxParser 解析url失败.android SaxParser如何解析url

我在android中使用SaxParser 解析xml文件失败,我解析的xml格式如下

<songs>
 
  <song id="269611">
 
    <start>2015-01-02T04:36:52Z</start>
 
    <title>Beyond Me</title>
 
    <artist>tobyMac</artist>
 
    <logo>http://www.quuit.com/quu/content/themes/base/images/music_none.png</logo>
 
    <lyrics>no</lyrics>
 
    <bio>yes</bio>
 
    <coupon>no</coupon>
 
    <ad>no</ad>
 
  </song>
 
  <song id="77476">
 
    <start>2015-01-2T04:32:51Z</start>
 
    <title>WHOLLY YOURS</title>
 
    <artist>David Crowder Band</artist>
 
    <logo>http://www.quuit.com/imageserver/thumbnail/WHOLLY_YOURSDavid_Crowder_Band.jpeg</logo>
 
    <lyrics>no</lyrics>
 
    <bio>yes</bio>
 
    <coupon>no</coupon>
 
    <ad>no</ad>
 
  </song>
<
</songs>

 

我尝试解析这个xml文件,但是获得的 <logo></logo>标签中的url是不完整的 ,比如http://www.quuit.com/imageserver/thumbnail/WHOLLY_YOURSDavid_Crowder_Band.jpeg 这个字符串,我有时候获得的是 Band.jpeg 有时候是 wder_Band.jpeg ,无法获得完整的 <logo></logo>标签中 的url地址

我的解析above xml 文件的代码如下

public class QuuAsyncTask extends AsyncTask<Object, Void, BaseQuuVO> {
private Exception exception;
private QuuServiceDelegate serviceDelegate;
protected BaseQuuVO doInBackground(Object... param) {
    BaseQuuVO baseVO = new BaseQuuVO();
    try {
 
        QuuDefaultHandler defaultHandler = (QuuDefaultHandler) param[1];
 
        serviceDelegate = (QuuServiceDelegate) param[2];
 
        /** 处理 XML */
 
        SAXParserFactory spf = SAXParserFactory.newInstance();
 
        SAXParser sp = spf.newSAXParser();
 
        XMLReader xr = sp.getXMLReader();
        /**设置url XML Tags */
         URL sourceUrl = new URL((String) param[0]);
        /** 创建一个解析器并解析tag( 继承 DefaultHandler ) */
         xr.setContentHandler(defaultHandler);
        InputSource inputSource = new InputSource(sourceUrl.openStream());
 
        inputSource.setEncoding("ISO-8859-1");
 
        xr.parse(inputSource);
 
        baseVO = (BaseQuuVO) defaultHandler.getData();
 
        return baseVO;
 
    } catch (Exception e) {
 
        this.exception = e;
 
        return null;
 
    }
}
}
protected void onPostExecute(BaseQuuVO result) {
     super.onPostExecute(result); 
    // TODO:   处理这个异常
    // TODO:  做一些其他处理
    if (result != null) {
         serviceDelegate.quuResponseReceived(result);
     } else {
         serviceDelegate.quuResponseFailure("Problem loading data"); 
    }
}
}
public class QuuAsyncTask extends AsyncTask<Object, Void, BaseQuuVO> {
    private Exception exception;
 
    private QuuServiceDelegate serviceDelegate;
    protected BaseQuuVO doInBackground(Object... param) {
         BaseQuuVO baseVO = new BaseQuuVO();
        try {
             QuuDefaultHandler defaultHandler = (QuuDefaultHandler) param[1];
 
            serviceDelegate = (QuuServiceDelegate) param[2];
 
            /** 处理 XML */
 
            SAXParserFactory spf = SAXParserFactory.newInstance();
 
            SAXParser sp = spf.newSAXParser();
 
            XMLReader xr = sp.getXMLReader();



               /**设置url XML Tags */
 
            URL sourceUrl = new URL((String) param[0]);



            /** 创建一个解析器并解析tag( 继承 DefaultHandler ) */
 
            xr.setContentHandler(defaultHandler);
 
            InputSource inputSource = new InputSource(sourceUrl.openStream());
 
            inputSource.setEncoding("ISO-8859-1");
 
            xr.parse(inputSource);
 
            baseVO = (BaseQuuVO) defaultHandler.getData();
 
            return baseVO;
 
        } catch (Exception e) {
 
            this.exception = e;
 
            return null;
 
        }
 
    }
    protected void onPostExecute(BaseQuuVO result) {
         super.onPostExecute(result);
 
    // TODO:   处理这个异常
    // TODO:  做一些其他处理
        if (result != null) {
 
            serviceDelegate.quuResponseReceived(result);
 
        } else {
 
            serviceDelegate.quuResponseFailure("Problem loading data");
 
        }
    }
}
}



public class PlayListXMLParser extends QuuDefaultHandler {
    private List<PlayListSongVO> songsVO;
 
    private String tempVal;
 
    private PlayListSongVO tempPlayListSongVO;
 
    private PlayListsVO playListsVO = new PlayListsVO();
    public PlayListXMLParser() {
 
        songsVO = new ArrayList<PlayListSongVO>();
 
    }
    @Override
 
    public PlayListsVO getData() {
 
        playListsVO.setSongs(songsVO);
 
        return playListsVO;
 
    }
    // Event Handlers
 
    public void startElement(String uri, String localName, String qName,
 
                             Attributes attributes) throws SAXException {
 
        // 重置
        tempVal = "";
 
        if (qName.equalsIgnoreCase("song")) {
 
            //  创建一个新的employee
 对象
            tempPlayListSongVO = new PlayListSongVO();
 
        }
 
    }
    public void characters(char[] ch, int start, int length)
 
            throws SAXException {
 
        tempVal = new String(ch, start, length);
 
    }
    public void endElement(String uri, String localName, String qName)
 
            throws SAXException {
 
        if (qName.equalsIgnoreCase("song")) {
 
            //  加入到list中
            songsVO.add(tempPlayListSongVO);
 
        } else if (qName.equalsIgnoreCase("id")) {
 
            tempPlayListSongVO.setId(tempVal);
 
        } else if (qName.equalsIgnoreCase("start")) {
 
            tempPlayListSongVO.setStart(tempVal);
 
        } else if (qName.equalsIgnoreCase("title")) {
 
            tempPlayListSongVO.setTitle(tempVal);
 
        } else if (qName.equalsIgnoreCase("artist")) {
 
            tempPlayListSongVO.setArtist(tempVal);
 
        } else if (qName.equalsIgnoreCase("logo")) {
 
            tempPlayListSongVO.setLogo(tempVal);
 
        } else if (qName.equalsIgnoreCase("lyrics")) {
 
            tempPlayListSongVO.setLyrics(tempVal);
 
        } else if (qName.equalsIgnoreCase("bio")) {
 
            tempPlayListSongVO.setBio(tempVal);
 
        } else if (qName.equalsIgnoreCase("coupon")) {
 
            tempPlayListSongVO.setCoupon(tempVal);
 
        } else if (qName.equalsIgnoreCase("ad")) {
 
            tempPlayListSongVO.setAd(tempVal);
 
        }
    }
}
}


更新 :

public class SongDetailXMLParser extends QuuDefaultHandler {
    // private String tempVal;
 
    private SongDetailsVO songDetailsVO;
 
    private StringBuilder tempStringBuilder;
    public SongDetailXMLParser() {
    }
    @Override
 
    public SongDetailsVO getData() {
 
        return songDetailsVO;
 
    }

   // Event Handlers
 
    public void startElement(String uri, String localName, String qName,
 
                             Attributes attributes) throws SAXException {
 
        tempStringBuilder = new StringBuilder();
 
        if (qName.equalsIgnoreCase("song")) {
 
            //   创建一个新的实例
            songDetailsVO = new SongDetailsVO();
 
        }
 
    }
    public void characters(char[] ch, int start, int length)
 
            throws SAXException {
 
        tempStringBuilder.append(ch);
    }
   public void endElement(String uri, String localName, String qName)
 
            throws SAXException {
 
        if (qName.equalsIgnoreCase("song")) {
 
            // 加入到list中

        } else if (qName.equalsIgnoreCase("id")) {
 
            songDetailsVO.setId(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("duration")) {
 
            songDetailsVO.setDuration(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("title")) {
 
            songDetailsVO.setTitle(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("artist")) {
 
            songDetailsVO.setArtist(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("logo")) {
 
            songDetailsVO.setLogo(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("amazon")) {
 
            songDetailsVO.setAmazon(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("itunes")) {
 
            songDetailsVO.setItunes(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("videolink")) {
 
            songDetailsVO.setVideolink(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("ringtone")) {
 
            songDetailsVO.setRingtone(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("lyrics")) {
 
            songDetailsVO.setLyrics(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("bio")) {
 
            songDetailsVO.setBio(tempStringBuilder.toString());
 
        } else if (qName.equalsIgnoreCase("share")) {
 
            songDetailsVO.setShare(tempStringBuilder.toString());
 
        }
 
    }
}
}

处理方法

解析器没次处理标签的时候都会调用 这个方法

void characters(char[] ch, int start, int length) throws SAXException


它可能会把内容分割成不同的串,

所以下面的代码是错误的

public void characters(char[] ch, int start, int length)
 
        throws SAXException {
 
    tempStringBuilder.append(ch);
}
}


你需要重新处理这个而方法

public void characters(char[] ch, int start, int length)
 
        throws SAXException {
 
    tempVal = new String(ch, start, length);
}
}


可以尝试使用如下的代码,具体的还需要你自己多学习

public void characters(char[] ch, int start, int length)
 
        throws SAXException {
 
    tempStringBuilder.append(ch, start, length);
}
}


原文地址:http://www.itmmd.com/201501/489.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android开发app删除sim卡联系人   上一篇
下一篇  android 在一条线的中间添加文本
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!