<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亚洲网美利坚合众国| 久久国产精品免费一区二区三区| 午夜免费福利网站| 亚洲国产综合AV在线观看| 日韩电影免费在线观看网址| 四虎影院永久免费观看| 污污视频网站免费观看| 国产精品亚洲美女久久久| 国产免费牲交视频免费播放| 亚洲色中文字幕无码AV| 成人A片产无码免费视频在线观看| 国产亚洲精品国产| 精品无码国产污污污免费网站 | 亚洲日韩欧洲乱码AV夜夜摸| a毛片在线免费观看| 亚洲天堂男人天堂| 台湾一级毛片永久免费| 久久亚洲精品国产精品婷婷| 国产日产成人免费视频在线观看 | a视频在线观看免费| 亚洲男人的天堂在线播放| 国产免费一区二区三区| 亚洲精品精华液一区二区 | 亚洲国产精品无码观看久久| 波多野结衣中文一区二区免费| 人体大胆做受免费视频| 亚洲国语精品自产拍在线观看| 91成年人免费视频| 豆国产96在线|亚洲| 亚洲精品无码午夜福利中文字幕 | 黄色短视频免费看| 日韩亚洲AV无码一区二区不卡| 国产免费AV片在线播放唯爱网| 亚洲成a∨人片在无码2023| 中文字幕亚洲综合久久男男| 亚州免费一级毛片| 一级做a爰片性色毛片免费网站 | 亚洲丰满熟女一区二区v| 天堂亚洲免费视频|