Android 如何解析<;媒体:缩略图>;来自rss提要xml的标记?
我正在android上解析rss提要xml,能够检索所有其他内容,但未能检索提要中的图像 我正在使用sax解析器 图像嵌入在Android 如何解析<;媒体:缩略图>;来自rss提要xml的标记?,android,coding-style,rss,Android,Coding Style,Rss,我正在android上解析rss提要xml,能够检索所有其他内容,但未能检索提要中的图像 我正在使用sax解析器 图像嵌入在标记中。 看起来像这样 <media:thumbnail>http://www.*some_website*.com/..../Client000040008200000082068.jpg</media:thumbnail> http://www.*一些网站*.com/…/Client000040008200000082068.jpg 我见过很
标记中。
看起来像这样
<media:thumbnail>http://www.*some_website*.com/..../Client000040008200000082068.jpg</media:thumbnail>
http://www.*一些网站*.com/…/Client000040008200000082068.jpg
我见过很多例子,但它们是从嵌入的url链接解析的,也见过像这样嵌入的链接
<media:thumbnail="link here"></media:thumbnail>
它们都一样吗?
如何解析这些标签
请帮我回答
多谢各位
编辑
这是我的rss处理程序
public void startDocument() throws SAXException {
mFeed = new Feed();
}
public void endDocument() throws SAXException {
Date now = new Date();
//Date now = Calendar.getInstance().getTime();
mFeed.setRefresh(now);
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//Only consider elements from allowed third-party namespaces
if (NAMESPACES.contains(uri)) {
mSb = new StringBuffer();
String value = localName.trim();
if (value.equalsIgnoreCase("rss") || value.equalsIgnoreCase("rdf")) {
isType = true;
} else if (value.equalsIgnoreCase("feed")) {
isType = true;
isFeed = true;
} else if (value.equalsIgnoreCase("channel")) {
isFeed = true;
} else if (value.equalsIgnoreCase("item") || value.equalsIgnoreCase("entry")) {
mItem = new Item();
isItem = true;
mNbrItems++;
} else if (value.equalsIgnoreCase("title"))
isTitle = true;
else if (value.equalsIgnoreCase("link")) {
// Get attributes from link element for Atom format
if (attributes != null) {
// Enclosure for Atom format
if (attributes.getValue("rel") != null && attributes.getValue("rel").equalsIgnoreCase("enclosure")) {
mEnclosure = new Enclosure();
mMimeAttribute = attributes.getValue("type");
isEnclosure = true;
}
mHrefAttribute = attributes.getValue("href");
}
isLink = true;
} else if (value.equalsIgnoreCase("pubDate") || value.equalsIgnoreCase("published") || value.equalsIgnoreCase("date"))
isPubdate = true;
else if (value.equalsIgnoreCase("guid") || value.equalsIgnoreCase("id"))
isGuid = true;
else if (value.equalsIgnoreCase("description") || value.equalsIgnoreCase("summary"))
isDescription = true;
else if ((value.trim().equals("media:thumbnail")))
{
// isImageLink = true;
String attrValue = attributes.getValue("url");
int tmp =Integer.parseInt(attrValue);
// tmp.setLink(attrValue);
/*if (localName.trim().equals("thumbnail")) {
String thumbnail = attributes.getValue("url");
}*/
}
else if (value.equalsIgnoreCase("encoded") || value.equalsIgnoreCase("content"))
isContent = true;
else if (value.equalsIgnoreCase("source"))
isSource = true;
else if (value.equalsIgnoreCase("enclosure")) {
// Enclosure for RSS format
if (attributes != null) {
mEnclosure = new Enclosure();
mMimeAttribute = attributes.getValue("type");
mHrefAttribute = attributes.getValue("url");
isEnclosure = true;
}
}
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
//Only consider elements from allowed third-party namespaces
if (NAMESPACES.contains(uri)) {
String value = localName.trim();
if (value.equalsIgnoreCase("rss")) {
mFeed.setType(Feed.TYPE_RSS);
isType = false;
} else if (value.equalsIgnoreCase("feed")) {
mFeed.setType(Feed.TYPE_ATOM);
isType = false;
isFeed = false;
} else if (value.equalsIgnoreCase("RDF")) {
mFeed.setType(Feed.TYPE_RDF);
isType = false;
} else if (value.equalsIgnoreCase("channel")) {
isFeed = false;
} else if (value.equalsIgnoreCase("item") || value.equalsIgnoreCase("entry")) {
if (mNbrItems <= maxItems) {
if (mItem.getGuid() == null)
mItem.setGuid(mItem.getLink().toString());
mFeed.addItem(mItem);
}
isItem = false;
} else if (value.equalsIgnoreCase("title") && !isSource) {
if (isItem)
mItem.setTitle(Html.fromHtml(mSb.toString().trim()).toString());
else if (isFeed)
mFeed.setTitle(Html.fromHtml(mSb.toString().trim()).toString());
isTitle = false;
} else if (value.equalsIgnoreCase("link") && !isSource) {
if (isItem) {
try {
if (isEnclosure) {
// Enclosure for Atom format
mEnclosure.setMime(mMimeAttribute);
mEnclosure.setURL(new URL(mHrefAttribute));
mItem.addEnclosure(mEnclosure);
mMimeAttribute = null;
isEnclosure = false;
} else if (mHrefAttribute != null)
mItem.setLink(new URL(mHrefAttribute));
else
mItem.setLink(new URL(mSb.toString().trim()));
} catch(MalformedURLException mue) {
throw new SAXException(mue);
}
} else if (isFeed && mFeed.getHomePage() == null) {
try {
if (mSb != null && mSb.toString() != "") // RSS
mFeed.setHomePage(new URL(mSb.toString().trim()));
else if (mMimeAttribute == "text/html") //Atom
mFeed.setHomePage(new URL(mHrefAttribute));
} catch(MalformedURLException mue) {
throw new SAXException(mue);
}
}
mHrefAttribute = null;
isLink = false;
} else if (value.equalsIgnoreCase("pubDate") || value.equalsIgnoreCase("published") || value.equalsIgnoreCase("date")) {
if (isItem) {
for (int i = 0; i < DATE_FORMATS.length; i++) {
try {
//String pattern = mSimpleDateFormats[i].toPattern();
mItem.setPubdate(mSimpleDateFormats[i].parse(mSb.toString().trim()));
break;
} catch (ParseException pe) {
if (i == DATE_FORMATS.length-1) {
throw new SAXException(pe);
}
}
}
}
isPubdate = false;
} else if ((value.equalsIgnoreCase("guid") || value.equalsIgnoreCase("id")) && !isSource) {
if (isItem)
mItem.setGuid(mSb.toString().trim());
isGuid = false;
} else if (value.equalsIgnoreCase("description") || value.equalsIgnoreCase("summary")) {
if (isItem)
//mItem.setContent(Html.fromHtml(mSb.toString().trim()).toString());
mItem.setContent(removeContentSpanObjects(mSb).toString().trim() + System.getProperty("line.separator" ));
isDescription = false;
} else if (value.equalsIgnoreCase("media:thumbnail") || value.equalsIgnoreCase("media:content")) {
if (isItem)
//mItem.setContent(Html.fromHtml(mSb.toString().trim()).toString());
System.out.println(removeContentSpanObjects(mSb).toString().trim());
mItem.setMimageLink(removeContentSpanObjects(mSb).toString().trim());
isImageLink = false;
} else if (value.equalsIgnoreCase("encoded") || value.equalsIgnoreCase("content")) {
if (isItem)
//mItem.setContent(Html.fromHtml(mSb.toString().trim()).toString());
mItem.setContent(removeContentSpanObjects(mSb).toString().trim() + System.getProperty("line.separator" ));
isContent = false;
} else if (value.equalsIgnoreCase("source"))
isSource = false;
else if (value.equalsIgnoreCase("enclosure")) {
if (isItem) {
try {
// Enclosure for RSS format
mEnclosure.setMime(mMimeAttribute);
mEnclosure.setURL(new URL(mHrefAttribute));
mItem.addEnclosure(mEnclosure);
mMimeAttribute = null;
mHrefAttribute = null;
} catch(MalformedURLException mue) {
throw new SAXException(mue);
}
}
isEnclosure = false;
}
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
if (isType || isTitle || isLink || isPubdate || isGuid || isDescription || isImageLink || isContent)
mSb.append(new String(ch, start, length));
}
public Feed handleFeed(URL url) throws IOException, SAXException, ParserConfigurationException {
getParser().parse(new InputSource(url.openStream()));
// Reordering the list of items, first item parsed (most recent) -> last item in the list
Collections.reverse(mFeed.getItems());
mFeed.setURL(url);
if (mFeed.getHomePage() == null)
mFeed.setHomePage(url);
return mFeed;
}
private XMLReader getParser() throws SAXException, ParserConfigurationException {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(this);
return xr;
public void startDocument()引发异常{
mFeed=新的Feed();
}
public void endDocument()引发异常{
现在日期=新日期();
//现在日期=Calendar.getInstance().getTime();
mFeed.setRefresh(现在);
}
public void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException{
/只考虑允许的第三方命名空间中的元素
if(NAMESPACES.contains(uri)){
mSb=新的StringBuffer();
字符串值=localName.trim();
if(value.equalsIgnoreCase(“rss”)| | value.equalsIgnoreCase(“rdf”)){
isType=true;
}else if(value.equalsIgnoreCase(“提要”)){
isType=true;
isFeed=true;
}else if(value.equalsIgnoreCase(“通道”)){
isFeed=true;
}else if(value.equalsIgnoreCase(“项目”)| | value.equalsIgnoreCase(“条目”)){
mItem=新项();
isItem=真;
mNbrItems++;
}else if(value.equalsIgnoreCase(“标题”))
isTitle=真;
else if(value.equalsIgnoreCase(“链接”)){
//从链接元素中获取Atom格式的属性
如果(属性!=null){
//Atom格式的封装
if(attributes.getValue(“rel”)!=null&&attributes.getValue(“rel”).equalsIgnoreCase(“附件”)){
mEnclosure=新外壳();
mmimeiAttribute=attributes.getValue(“类型”);
isEnclosure=true;
}
mHrefAttribute=attributes.getValue(“href”);
}
isLink=true;
}else if(value.equalsIgnoreCase(“publidate”)| value.equalsIgnoreCase(“published”)| value.equalsIgnoreCase(“date”))
isPubdate=true;
else if(value.equalsIgnoreCase(“guid”)| | value.equalsIgnoreCase(“id”))
isGuid=true;
else if(value.equalsIgnoreCase(“说明”)| | value.equalsIgnoreCase(“摘要”))
isDescription=true;
如果((value.trim().equals(“媒体:缩略图”))
{
//isImageLink=true;
字符串attrValue=attributes.getValue(“url”);
int tmp=Integer.parseInt(attrValue);
//tmp.setLink(属性值);
/*如果(localName.trim().equals(“缩略图”){
字符串缩略图=attributes.getValue(“url”);
}*/
}
else if(value.equalsIgnoreCase(“编码”)| | value.equalsIgnoreCase(“内容”))
isContent=true;
else if(value.equalsIgnoreCase(“源”))
isSource=true;
else if(value.equalsIgnoreCase(“附件”)){
//RSS格式的附件
如果(属性!=null){
mEnclosure=新外壳();
mmimeiAttribute=attributes.getValue(“类型”);
mHrefAttribute=attributes.getValue(“url”);
isEnclosure=true;
}
}
}
}
public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException{
/只考虑允许的第三方命名空间中的元素
if(NAMESPACES.contains(uri)){
字符串值=localName.trim();
if(value.equalsIgnoreCase(“rss”)){
mFeed.setType(Feed.TYPE_RSS);
isType=false;
}else if(value.equalsIgnoreCase(“提要”)){
mFeed.setType(Feed.TYPE_ATOM);
isType=false;
isFeed=false;
}else if(value.equalsIgnoreCase(“RDF”)){
mFeed.setType(Feed.TYPE_RDF);
isType=false;
}else if(value.equalsIgnoreCase(“通道”)){
isFeed=false;
}else if(value.equalsIgnoreCase(“项目”)| | value.equalsIgnoreCase(“条目”)){
如果(n)是列表中的最后一项
Collections.reverse(mFeed.getItems());
设置url(url);
if(mFeed.getHomePage()==null)
设置主页(url);
返回mFeed;
}
私有XMLReader getParser()引发SAXException,ParserConfiguration异常{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
XMLReader xr=sp.getXMLReader();
xr.setContentHandler(此);
返回xr;
您需要使用qName
从:
localName—本地名称(不带前缀),如果未执行命名空间处理,则为空字符串
qName—限定名称(带前缀),如果限定名称不可用,则为空字符串
本地名称基本上去掉了名称空间,因此如果您愿意,也可以使用匹配的“缩略图”。@PareshMayani我已使用代码进行了更新。我希望这一个有帮助。如果您希望更新更多代码,请告诉我。谢谢。