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 閱讀(345) 評論(0)  編輯  收藏 所屬分類: J2SE
          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泾源县| 沂南县| 广东省| 高雄市| 精河县| 镇赉县| 邢台市| 元阳县| 贵港市| 永宁县| 喀喇沁旗| 武鸣县| 阿拉尔市| 济宁市| 乌兰县| 克拉玛依市| 开远市| 会东县| 梁平县| 湄潭县| 广宁县| 县级市| 万源市| 威海市| 溧阳市| 祁连县| 广州市| 双城市| 涞源县| 开平市| 舒城县| 新巴尔虎左旗| 广宗县| 泾阳县| 海伦市| 陆良县| 五家渠市| 东阿县| 武冈市| 岗巴县| 库伦旗|