<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0

    一個RSS頻道通常被我們叫做Feed,假如現在我們收集的RSS Feed越來越多,我想分享出去。那么可以做的辦法有什么呢?手工把這些Feed的地址一個個copy出來,然后發送嗎?這樣太麻煩了。

    OPML(Outline Processor Markup Language)協議正是用于解決這樣問題的。利用OPML協議,我們可以通過閱讀器把已經訂閱的頻道導出為OPML協議規定的格式,從而作為
    一個文件分享出去。

    Informa中同樣提供了對于OPML文件的解析,目前支持的版本是1.1版本。

    ★OPMLParser



    OPMLParser中同樣提供了類似FeedParser的多種數據源支持的解析,可以分別從URL,文件,字節流,字符流中讀入OPML文件,這個類的核心方法是parse(Dcoument)。

        private static synchronized Collection<FeedIF> parse(Document doc)
                
    throws ParseException {

            logger.debug(
    "start parsing.");
            
    // Get the root element (must be opml)
            Element root = doc.getRootElement();
            String rootElement 
    = root.getName().toLowerCase();
            
    // Decide which parser to use
            if (rootElement.startsWith("opml")) {
                String opmlVersion 
    = root.getAttribute("version").getValue();
                
    if (opmlVersion.indexOf("1.1">= 0{
                    logger.info(
    "Collection uses OPML root element (Version 1.1).");
                    
    return OPML_1_1_Parser.parse(root);
                }

            }


            
    // did not match anything
            throw new UnsupportedFormatException("Unsupported OPML root element ["
                    
    + rootElement + "].");
        }


    可以看到這個類又是一個中介類,簡單地分析協議的版本然后委托給相應的解析器。目前由于OPML協議解析器只支持1.1版本,所以只有一個OPML_1_1_Parser

    ★OPML_1_1_Parser

        static Collection<FeedIF> parse(Element root) {

            Collection
    <FeedIF> feedColl = new ArrayList<FeedIF>();

            Date dateParsed 
    = new Date();
            logger.debug(
    "start parsing.");

            
    // Lower the case of these tags to simulate case-insensitive parsing
            ParserUtils.matchCaseOfChildren(root, "body");

            
    // Get the head element (only one should occur)
            
    //    Element headElem = root.getChild("head");
            
    //    String title = headElem.getChildTextTrim("title");

            
    // Get the body element (only one occurs)
            Element bodyElem = root.getChild("body");

            
    // 1..n outline elements
            ParserUtils.matchCaseOfChildren(bodyElem, "outline");
            List feeds 
    = bodyElem.getChildren("outline");
            Iterator i 
    = feeds.iterator();
            
    while (i.hasNext()) {
                Element feedElem 
    = (Element) i.next();
                
    // get title attribute
                Attribute attrTitle = feedElem.getAttribute("title");
                String strTitle 
    = "[No Title]";
                
    if (attrTitle != null{
                    strTitle 
    = attrTitle.getValue();
                }

                FeedIF feed 
    = new Feed(strTitle);
                
    if (logger.isDebugEnabled()) {
                    logger.debug(
    "Feed element found (" + strTitle + ").");
                }

                
    // get text attribute
                Attribute attrText = feedElem.getAttribute("text");
                String strText 
    = "[No Text]";
                
    if (attrText != null{
                    strText 
    = attrText.getValue();
                }

                feed.setText(strText);
                
    // get attribute type (for example: 'rss')
                Attribute attrType = feedElem.getAttribute("type");
                String strType 
    = "text/xml";
                
    if (attrType != null{
                    strType 
    = attrType.getValue();
                }

                feed.setContentType(strType);

                
    // TODO: handle attribute version (for example: 'RSS')

                
    // get attribute xmlUrl
                Attribute attrXmlUrl = feedElem.getAttribute("xmlUrl");
                
    if (attrXmlUrl != null && attrXmlUrl.getValue() != null{
                    feed.setLocation(ParserUtils.getURL(attrXmlUrl.getValue()));
                }

                
    // get attribute htmllUrl
                Attribute attrHtmlUrl = feedElem.getAttribute("htmlUrl");
                
    if (attrHtmlUrl != null && attrHtmlUrl.getValue() != null{
                    feed.setSite(ParserUtils.getURL(attrHtmlUrl.getValue()));
                }

                
    // set current date
                feed.setDateFound(dateParsed);
                
    // add feed to collection
                feedColl.add(feed);
            }


            
    return feedColl;
        }


    OPML協議的結構如下:

     A.根節點是<opml version="1.x">元素
     B.子節點<head>元素,該元素包含了title,dateCreated,dateModified,ownerName等屬性
     C.子節點<body>元素,該元素包含了0..若干個<outline>元素,該元素是可嵌套的



    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2010-01-02 20:56 Paul Lin 閱讀(350) 評論(0)  編輯  收藏 所屬分類: J2SE
    <2010年1月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久99热精品免费观看牛牛| 一级毛片免费播放视频| a毛片在线看片免费| 亚洲综合在线另类色区奇米| 丁香六月婷婷精品免费观看 | 国产精品久久永久免费| 亚洲一级二级三级不卡| 51在线视频免费观看视频| 久久久久亚洲av无码专区导航 | 狼群影院在线观看免费观看直播 | 国产亚洲av片在线观看播放| 国产精品福利在线观看免费不卡| 亚洲熟女乱综合一区二区| jzzjzz免费观看大片免费| 区三区激情福利综合中文字幕在线一区亚洲视频1| 亚洲av综合av一区二区三区| 国产一级一片免费播放i| 日韩在线观看免费| 国产亚洲美女精品久久久久狼 | 久久青草精品38国产免费| 亚洲成年人在线观看| 免费在线视频你懂的| 亚洲久悠悠色悠在线播放| 国产hs免费高清在线观看| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 免费看又黄又爽又猛的视频软件| 亚洲一级片免费看| 一区二区免费视频| 亚洲熟妇AV乱码在线观看| 亚洲第一成人影院| 老司机69精品成免费视频| 亚洲AV综合色区无码二区偷拍| 免费国产精品视频| 国产亚洲免费的视频看| 亚洲综合中文字幕无线码| 亚洲成av人片天堂网老年人| 四虎影视成人永久免费观看视频 | 又大又黄又粗又爽的免费视频 | 成年人网站在线免费观看| 一级毛片免费全部播放| 亚洲欧洲日产专区|