`
ttitfly
  • 浏览: 623936 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Rome使用简单说明二(部分关键源码分析)

SUN 
阅读更多

Parser部分(解析)

com.sun.syndication.io.SyndFeedInput input = new com.sun.syndication.io.SyndFeedInput();
调用
public SyndFeedInput() {
        this(false);
}
public SyndFeedInput(boolean validate) {
        _feedInput = new WireFeedInput(validate);
}
直接就构造了对象WireFeedInput _feedInput.

com.sun.syndication.feed.synd.SyndFeed feed = input.build(new

com.sun.syndication.io.XmlReader(feedUrl));

实际上调用的是WireFeedInput对象的build方法

WireFeedInput里有个对象FeedParsers,构造WireFeedInput时,也会实例化FeedParsers,实例化

FeedParsers时,由于FeedParsers extends PluginManager,所以会通过PluginManager去加载

rome.properties文件,(因为FeedParsers 里FEED_PARSERS_KEY = "WireFeedParser.classes"所以会去

rome.properties里加载key为WireFeedParser.classes的值)。并实例化所有的parser对象。

所以当在WireFeedInput里调用FeedParsers的getParserFor(document)方法时,会自动匹配该document需

要用哪个解析器来进行解析

FeedParsers.getParserFor(document)方法返回的是个interface WireFeedParser.
在WireFeedInput里调用
public WireFeed build(Document document) throws IllegalArgumentException,FeedException {
        WireFeedParser parser = FEED_PARSERS.getParserFor(document);//确定使用哪个解析器
        if (parser==null) {
            throw new IllegalArgumentException("Invalid document");
        }
        return parser.parse(document, _validate);//最终调用的parser方法,返回的是一个

WireFeed对象。

 

    }

 

 


SyndFeedImpl构造函数接受到WireFeed参数以后,直接通过feedType获取需要哪种转换器(Converter)
因为CONVERTERS是Converters对象,Converters是extends PluginManager的。所以可以通过Converters

来加载rome.properties,并读取key为Converter.classes的value;
 public SyndFeedImpl(WireFeed feed) {
        this(SyndFeed.class,IGNORE_PROPERTIES);
        if (feed!=null) {
            _feedType = feed.getFeedType();
            Converter converter = CONVERTERS.getConverter(_feedType);//获取需要哪种转换器
            if (converter==null) {
                throw new IllegalArgumentException("Invalid feed type ["+_feedType+"]");
            }
            converter.copyInto(feed,this);//将WireFeed对象里的各个属性值,转换为SyndFeed对应

的值
        }
    }

//将WireFeed对象里的各个属性值,转换为SyndFeed对应的值
public void copyInto(WireFeed feed,SyndFeed syndFeed) {
        syndFeed.setModules(ModuleUtils.cloneModules(feed.getModules()));
        if (((List)feed.getForeignMarkup()).size() > 0) {
            syndFeed.setForeignMarkup(feed.getForeignMarkup());
        }
        syndFeed.setEncoding(feed.getEncoding());
        Channel channel = (Channel) feed;
        syndFeed.setTitle(channel.getTitle());
        syndFeed.setLink(channel.getLink());
        syndFeed.setDescription(channel.getDescription());

        Image image = channel.getImage();
        if (image!=null) {
            syndFeed.setImage(createSyndImage(image));
        }

        List items = channel.getItems();
        if (items!=null) {
            syndFeed.setEntries(createSyndEntries(items));
        }
    }

Channel extends WireFeed(是个abstaract)


输出部分:

//写入到另一个文件里
SyndFeedOutput output = new SyndFeedOutput();
feed.setFeedType(feedType);//以哪种格式输出feed,如果这里不设置以哪种格式输出,会以它原来的格

式输出
output.output(feed, new File("c:/pic/2.xml"));

直接调用的是SyndFeedOutput对象里的方法:
public void output(SyndFeed feed,File file) throws IOException, FeedException {
        _feedOutput.output(feed.createWireFeed(),file);//先获得真正的WireFeed后,再让

WireFeedOutput去处理
    }
WireFeedOutput对象里的output方法:
public void output(WireFeed feed,File file) throws

IllegalArgumentException,IOException,FeedException {
        Writer writer = new FileWriter(file);
        output(feed,writer);
        writer.close();
    }


Convert里:又把SyndFeed的Entries格式转换为WireFeed的Item形式

可以把WireFeed看成是一种中间格式,是document和SyndFeed之间的一种中间格式(只是可以这样看作)
public WireFeed createRealFeed(SyndFeed syndFeed) {
        return createRealFeed(getType(),syndFeed);
    }

    protected WireFeed createRealFeed(String type,SyndFeed syndFeed) {
        Channel channel = new Channel(type);
        channel.setModules(ModuleUtils.cloneModules(syndFeed.getModules()));

        channel.setEncoding(syndFeed.getEncoding());

        channel.setTitle(syndFeed.getTitle());
        channel.setLink(syndFeed.getLink());
        channel.setDescription(syndFeed.getDescription());
        SyndImage sImage = syndFeed.getImage();
        if (sImage!=null) {
            channel.setImage(createRSSImage(sImage));
        }

        List sEntries = syndFeed.getEntries();
        if (sEntries!=null) {
            channel.setItems(createRSSItems(sEntries));
        }
        return channel;
    }

 

总结:
1。WireFeedOutput和WireFeedInput只是对WireFeed的一种操作(也就是需要SyndOutput传递给它的参数

是个WireFeed对象,WireFeedInput返回的也是个WireFeed对象)。(Document<==>WireFeed之间转换)
例如:WireFeedInput是接收到一个Document对象,然后将其转换为WireFeed对象,同理 WireFeedOutput

也是接收到WireFeed对象后,将其转换为Document对象。
2。SyndFeedOutput和SyndFeedInput是操纵SyndFeedImpl对象的。例如:
SyndFeedInput build方法,创建SyndFeed对象
public SyndFeed build(Document document) throws IllegalArgumentException,FeedException {
        return new SyndFeedImpl(_feedInput.build(document));
    }
SyndFeedOut output方法 
public void output(SyndFeed feed,File file) throws IOException, FeedException {
        _feedOutput.output(feed.createWireFeed(),file);
    }
3。SyndFeedImpl对象:(SyndFeed<==>WireFeed):
A.public SyndFeedImpl(WireFeed feed)构造函数中代码converter.copyInto(feed,this);,将WireFeed

转换为SyndFeed格式
B.public WireFeed createWireFeed(String feedType),将SyndFeed格式转换为WireFeed

4.Convert 体现的是WireFeed和SyndFeed之间的转换


  
  • rome.rar (9 KB)
  • 描述: rome io包下的类之间的关系
  • 下载次数: 74
分享到:
评论

相关推荐

    rome-1.0.jar rome.jar 源码

    1. **导入源码**:首先,将"ROME1.0"压缩包解压,获取到"rome-1.0.jar"的源码文件,可以使用IDE如Eclipse或IntelliJ IDEA导入源码项目。 2. **了解包结构**:查看源码中的包组织,如`com.rometools`下的各个子包,...

    rome源码包和jar包

    2. **源码分析** - ROME1.0SRC.rar包含的是Rome的源代码,通过阅读源码,开发者可以深入了解其内部工作原理,包括如何解析XML结构,如何构建和操作Feed对象等。 - 源码学习有助于理解数据模型,如`Feed`, `Entry`,...

    java使用Rome解析Rss的实例

    接下来,我们将通过一个简单的实例来展示如何使用Rome解析RSS feed。首先,我们需要导入必要的库: ```java import com.rometools.rome.feed.synd.SyndFeed; import com.rometools.rome.io.SyndFeedInput; import ...

    RSS开源框架ROME1.0下载集合

    2. **源码与文档**:在下载集合中,"rome-1.0-javadoc"包含了完整的API文档,这对于理解并有效地使用ROME框架至关重要。通过这些Javadoc,开发者可以查找每个类、方法和接口的详细说明,了解如何实现特定功能。 3. ...

    rome-1.0RC2rss解析

    以下是关于Rome 1.0RC2的关键知识点: 1. **RSS和Atom Feed解析**:Rome库提供了`RSSModule`和`AtomModule`类,它们实现了JSR 172(JavaTM API for XML Processing, JAXP)的`Unmarshaller`接口,能够将XML数据转换...

    jdom和rome1.0包

    标题中的“jdom和rome1.0包”指的是两个Java库,一个是JDOM,另一个是ROME。这两个库在处理XML数据和RSS feed时起到关键作用。 JDOM(Java Document Object Model)是一个用纯Java实现的DOM(Document Object Model...

    jdom+rome-0.9 jar包合集

    为了处理和解析XML文件,开发者通常会使用专门的库,如Java中的JDOM和ROME。这两个库是Java开发者的强大工具,尤其在构建RSS(Really Simple Syndication) feeds时。 **JDOM** JDOM,全称为Java Document Object ...

    Rome OS 自举部分代码框架

    - "Gemini"可能代表了Rome OS自举过程中的一个关键组件或者模块,这可能是自举加载器的一部分,或者是内核初始化阶段的代码。 - 在分析这个文件之前,我们需要理解它在整个自举流程中的作用。Gemini文件可能包含了...

    rome-0.9.jar

    解压后,开发者可以直接将"rome-0.9.jar"添加到Java项目的类路径中,以便在项目中使用Rome的功能。 "rome-license.txt"则包含了Rome库的许可协议,这是开源软件中常见的文件,通常会声明软件的使用、修改和分发的...

    rome-1.0.jar.zip

    标题 "rome-1.0.jar.zip" 暗示我们正在处理一个压缩文件,其中包含一个名为 "rome-1.0.jar" 的Java归档(JAR)文件。描述同样简单明了,只重复了标题的信息。标签 "rome-1.0.jar" 强调了压缩包的核心内容。压缩包内...

    rome 实现rss订阅,中文出错解决方法

    项目中的其他部分,如数据库连接、文件读写等,都应使用相同的字符编码,以避免在数据传输和转换过程中出现乱码。 另外,有时问题可能出在环境差异上,比如在不同操作系统或服务器上的字符集设置不同。这时,可以在...

    rss-rome.jar

    NULL 博文链接:https://chenhao-yssy.iteye.com/blog/1074264

    利用Rome解析Rss

    Rome 是一个基于 Java 的开源项目,提供了一组 Atom/RSS 工具类,以使得用 Java 可以更方便和快捷地操作大部分 Syndication 格式数据。Rome 需要 JDK1.4 以上版本和 JDom.jar。 Rome 的主要功能包括解析器和生成器...

    可以用的jdom+rome.jar

    JDOM和ROME的结合使用,可以实现从XML文档中提取RSS Feed,然后通过ROME解析这些Feed,提取出文章标题、描述、链接等信息,甚至可以进一步处理这些信息,比如存入数据库或进行数据分析。这样的组合,为开发者提供了...

    jdom+rome JAR包

    在IT行业中,RSS(Really Simple Syndication)是一种广泛使用的数据格式,它允许用户订阅和获取网站更新,如新闻、博客文章或播客等。而"jdom+rome JAR包"是两个Java库,用于帮助开发者更方便地处理XML文档,并...

    时间插件ROME

    【时间插件ROME】是一款优秀的前端开发工具,主要用于在网页应用中实现自定义日期和时间选择功能。它具有无依赖性的特点,意味着开发者无需额外引入其他库或框架,即可直接使用该插件,大大简化了项目的构建过程。...

Global site tag (gtag.js) - Google Analytics