zoukankan      html  css  js  c++  java
  • 新闻类网站rss接口的编写心得

    使用的是Jdom中的相关API,具体步骤如下

    要求的格式:

    <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
    <channel>
    <title>上千趣,顶有趣</title>
    <description>千趣网,有趣新闻第一聚合平台,生产和提供适合社交网络传播的各类有趣新闻。</description>
    <link>http://www.qianqu.cc</link>
    <language>zh_CN</language>
    <pubDate>Tue, 06 Sep 2016 13:46:22 +0800</pubDate>
    <item>
    <title>
    <![CDATA[俄罗斯推出女模裸体高速举牌活动,成效实在是太好了 ]]>
    </title>
    <link>http://127.0.0.1:8080/life/55720.html?from=LieBao&s=cm</link>
    <description>
    <![CDATA[俄罗斯的交通事故发生率非常高,每年有三万多人因此死亡受伤 ]]>
    </description>
    <content:encoded>
    <![CDATA[
    <article id="articleContent">
    <p style="text-align: left; text-indent: 2em;">俄罗斯的交通事故发生率非常高,每年都有三万多人因此死亡受伤。为了让人们意识到超速行驶的危害,当局做了很多努力,效果都不理想。现在他们又做了一个大胆的尝试,那就是让半裸美女在街头举限速牌,提醒司机不要超速<span style="text-indent: 2em;">很多司机看到后果然将车速放缓,慢了下来。</span>
    </p><p style="text-align: center; text-indent: 2em;"><img src="http://www.qianqu.cc/uploads/image/article/big/20160906/1473140636321029057.jpg"/></p><p style="text-align: left; text-indent: 2em;">因为美女的颜值太高了,当她们在路边举牌的时候路过的车辆无一不按照规定限速安全驾驶。当局让半裸美女举限速标志,就是为了让人们放慢车速,不管是要看美女还是看限速牌,只要慢下来就是成功。
    </p><p style="text-align: center; text-indent: 2em;"><img src="http://www.qianqu.cc/uploads/image/article/big/20160906/1473140636507051888.jpg"/></p><p style="text-align: center; text-indent: 2em;"><img src="http://www.qianqu.cc/uploads/image/article/big/20160906/1473140636664041317.jpg"/></p><p style="text-align: center; text-indent: 2em;">
    <img src="http://www.qianqu.cc/uploads/image/article/big/20160906/1473140636765052287.jpg"/></p><p style="text-align: center; text-indent: 2em;"><img src="http://www.qianqu.cc/uploads/image/article/big/20160906/1473140636859014104.jpg"/></p><p style="text-align: left; text-indent: 2em;">这就是俄罗斯街头的场景。
    </p><p style="text-align: left; text-indent: 2em;">路边突然出现半裸美女,司机很容易分神。虽然她们是一番好意,举牌提醒司机不要超速,但分神带来的后果可能更加严重。之前莫斯科街头一辆印有女子胸部广告的卡车就在一天内引发500多起车祸。</p><p style="text-align: left; text-indent: 2em;">和美女一姐打嘴炮、探讨不一样姿势。微信添加朋友→公众号→搜“姿势情报局一姐”(已认证),太纯洁的,不要来!
    <br style="text-align: left;"/></p></article> ]]> </content:encoded> <category>生活</category> <source>千趣网</source> <pubDate>Tue, 06 Sep 2016 13:44:18 +0800</pubDate> </item> </channel> </rss>

    第一步:创建根标签

    Document doc = new Document();
    Element rss = new Element("rss");
    rss.setAttribute("version", "2.0");
    doc.setRootElement(rss);

    第二步:创建子标签(带有CDATA的)

    Element channel = new Element("channel");
    //将channel标签置于rss标签中
    rss.addContent(channel);
    //不带CDATA区域的
    Element CTitle = new Element("title");
    CTitle.addContent(channelData.getTitle());
    channel.addContent(CTitle);
    //带CDATA区域的
    Element CDescription = new Element("description");
    CDATA str = new CDATA(channelData.getDescription());
    CDescription.addContent(str);
    channel.addContent(CDescription);...........以此类推,需要多少标签,已同样的方式创建即可,如果标签较多,也得自己手动编写代码,是一件比较苦逼的活儿

    第三步:使用io流将拼接好的xml输出

    XMLOutputter out = new XMLOutputter();// 创建输出流
            ByteArrayOutputStream buf = new ByteArrayOutputStream();
            out.output(doc, buf);
            String ok = buf.toString("ISO-8859-1");
            return ok;
    这里需要强调一下:这里的编码我这边是需要改成iso-8859-1的(控制台输出的=对应的日志也是乱码,但是再浏览器中访问接口链接时,不会出现乱码),我这我也比较郁闷,之前换成utf-8不好使,会出现乱码

    注意事项:

      1,我使用的是springmvc作为表现层框架的

    @Controller
    @RequestMapping("")
    public class SuNingAction {
        @Autowired
        private SuNingService suNingService;
        @RequestMapping(method={RequestMethod.GET},produces = MediaType.APPLICATION_XHTML_XML_VALUE,value={"/suNing"})
        @ResponseBody()
        public String Xiaozhi(HttpServletResponse response) throws JAXBException, IOException {具体代码就是上面的三大步骤;return null;}

      2,关于xml中的名称空间问题<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">

      

            Document doc = new Document();
            Element rss = new Element("rss");
          //名称空间的添加
            Namespace ns= Namespace.getNamespace("content", "http://purl.org/rss/1.0/modules/content/");
            rss.addNamespaceDeclaration(ns);
             //版本号的添加
            rss.setAttribute("version", "2.0");
            doc.setRootElement(rss);
    //这招绝对好用

      3,有的rss中的content标签,需要带上encoded,比如说上面的案例就需要使用 <content:encoded>并且还需CDATA包裹

      

    Element Icontent = new Element("encoded", "content","http://purl.org/rss/1.0/modules/content/");
    CDATA c = new CDATA(itemData.get(i).getContent());
    Icontent.addContent(c);
    item.addContent(Icontent);

      4,时间格式问题

      涉及到时间的格式化问题Tue, 06 Sep 2016 13:44:18 +0800

      还有就是星期的转化,中英文的转换问题,这些可以通过百度自行解决,并不是难点

      5,还有最后一个问题是在servcie层中关于数据返回的问题

      注意变量的定义的范围,也就是全局变量与局部变量的定义位置问题,当从数据库中获取到数据后,通过get/set方法存值时,千万注意,不要将变量定义成全局的

      否则无论你检索的数据有多少条,存放值的对象中使用是一条相同的数据,这个问题虽然不大,但尽量不要犯,会被人嘲笑的, 擦,老子就被总监嘲笑半天.......

      

      

      

      

    Element CDescription = new Element("description");
    CDATA str = new CDATA(channelData.getDescription());
    CDescription.addContent(str);
    channel.addContent(CDescription);
  • 相关阅读:
    Spring session redis
    HttpClient Post Form data and get Response String
    compareTo & toString
    Zookeeper 脑裂
    Maven的HTTP代理设置
    Linux 硬件信息
    [Redis] RDB & AOF
    真实场景中WebRTC 用到的服务 STUN, TURN 和 signaling
    推荐一个VS2015 插件 Favorite Documents
    笔记 Activator.CreateInstance(Type)
  • 原文地址:https://www.cnblogs.com/liuhd/p/5845535.html
Copyright © 2011-2022 走看看