RSS
RSS(简易信息聚合)是一种消息来源格式规范,用以聚合经常发布更新数据的网站,例如博客文章、新闻、音频或视频的网摘。RSS文件包含全文或是节录的文字,再加上发布者所订阅之网摘数据和授权的元数据。
资源描述框架站点摘要(RDF Site Summary)就是RSS的英文原意,后来通过逆向首字母缩略词变更为Really Simple Syndication“简易信息聚合”。把新闻标题、摘要(Feed)、内容按照用户的要求,“送”到用户的桌面就是RSS的目的。RSS一词有时候大体上意为社会性书签,包括各种RSS的不同格式。
RSS摘要可以借由RSS阅读器、feed reader 或是 aggregator 等网页或以桌面为架构的软件来阅读。标准的XML档式可允许信息在一次发布后透过不同的程序阅览。用户借由将网摘输入RSS阅读器或是用鼠标点取浏览器上指向订阅程序的RSS小图标之URI(非通常称为URL)来订阅网摘。RSS阅读器定期检阅是否有更新,然后下载给监看用户界面。
RSS可以是以下三种解释中任一种的缩写,但其实这三者都是指同一种联合供稿(Syndication)的技术:
- RSS 2.0(Really Simple Syndication)
- RSS 0.91, RSS 1.0(RDF(Resource Description Framework)Site Summary)
- RSS 0.9 and 1.0(Rich Site Summary)
Java 构造RSS接口
Xml注解
@XmlRootElement
: 将Java类或枚举类型映射到XML元素@XmlAccessorType(XmlAccessType.FIELD)
: PROPERTY、FIELD、PUBLIC_MEMBER、NONE@XmlAttribute
: 将Java类的一个属性映射到与属性同名的一个XML属性@XmlElement
: 将Java类的一个属性映射到与属性同名的一个XML元素@XmlJavaTypeAdapter
使用定制的适配器(即扩展抽象类XmlAdapter
并重写marshal
和unmarshal
方法),以序列化Java类为XML
Xml JavaBean
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "rss")
public class VideoBean {
@XmlAttribute
private String version = "2.0";
@XmlElement(name = "channel")
private List<VideoBean.Channel> channelList;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public static class Channel {
@XmlJavaTypeAdapter(value = CDataAdapter.class)
private String title;
@XmlJavaTypeAdapter(value = CDataAdapter.class)
private String description;
@XmlJavaTypeAdapter(value = CDataAdapter.class)
private String link;
@XmlElement(name = "item")
private List<VideoBean.Item> itemList;
}
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public static class Item {
@XmlJavaTypeAdapter(value = CDataAdapter.class)
private String title;
@XmlJavaTypeAdapter(value = CDataAdapter.class)
private String link;
@XmlElement(name = "enclosure")
private Enclosure enclosure;
}
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public static class Enclosure {
@XmlAttribute
private String url;
@XmlAttribute
private String length;
@XmlAttribute
private String type;
}
}
Xml 工具类
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
public class XmlUtil {
public final static String CHARSET_UTF8 = "UTF-8";
/**
* java对象转换为xml文件
* @param obj 泛型对象
* @param charset 字符编码
* @param <T> 泛型
* @return xml文件的String
* @throws JAXBException
*/
public static <T> String beanToXml(T obj, String charset) throws JAXBException {
JAXBContext jc = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, charset);
// 1) 隐去报文头的生成, Marshaller.JAXB_FRAGMENT默认为false
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.bind.marshaller.CharacterEscapeHandler", new com.sun.xml.bind.marshaller.CharacterEscapeHandler() {
@Override
public void escape(char[] chars, int i, int i1, boolean b, Writer writer) throws IOException {
writer.write(chars, i, i1);
}
});
StringWriter writer = new StringWriter();
// 2) 自定义生成
writer.write("<?xml version=\"1.0\" encoding=\"" + charset + "\" ?>\n");
marshaller.marshal(obj, writer);
return writer.toString();
}
/**
* java对象转换为xml文件(UTF-8编码)
* @param obj 泛型对象
* @param <T> 泛型
* @return xml文件的String
*/
public static <T> String beanToXml(T obj) {
try {
return XmlUtil.beanToXml(obj, XmlUtil.CHARSET_UTF8);
} catch (JAXBException e) {
e.printStackTrace();
return null;
}
}
}
运行结果示例
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>
<![CDATA[测试]]>
</title>
<description>
<![CDATA[描述]]>
</description>
<link>
<![CDATA[链接url]]>
</link>
<item>
<title>
<![CDATA[测试]]>
</title>
<link>
<![CDATA[链接url]]>
</link>
<enclosure url="http://www.google.com" length="12" type="video/mp4"/>
</item>
</channel>
</rss>
参考资料: