首页 文章

如何让RSS输入GAE上的java webapp?

提问于
浏览
0

我根据https://rometools.github.io/rome/ROMEReleases/ROME0.4Beta/RomeV0.4Tutorials/RomeV0.4TutorialUsingRomeWithinAServletToCreateAndReturnAFeed.html示例准备了servlet . 但是,rss未在从头开始创建的https://validator.w3.org/feed/check.cgi上进行验证(因此,例如,在Yandex小部件策略中未对源进行验证),它会错过通道标记中的元素 .

有几个提示,如Atom:link in RSS using Rome如何启用atom:link,但它们基于rome.properties,并且无法在GAE上使用它们 - 属性文件未加载到webapp的类路径 . 这是制作atom的最简单方法:链接工作?

1 回答

  • 0

    已经意识到,可以将错过的元素添加到servlet中的xml右侧,因此为此特定目的不需要额外的Rome类Module:

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
        try {
            SyndFeed feed = getFeed(req, dataEntries, streamGauge);
    
            String feedType = req.getParameter(FEED_TYPE);
            feedType = (feedType != null) ? feedType : _defaultFeedType;
            feed.setFeedType(feedType);
            res.setContentType(MIME_TYPE);
            SyndFeedOutput output = new SyndFeedOutput();
    
            Writer writer = new StringWriter();
            output.output(feed, writer);
    
            SAXBuilder db = null;
            Document doc = null;
            db = new SAXBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(writer.toString()));
            try {
                doc = db.build(is);
            } catch (JDOMException e) {
                e.printStackTrace();
            }
    
            Element root =
                    doc.getRootElement();
    
            Element channel = root.getChild("channel");
    
            FeedServlet.AtomNSModule atomNSModule = (FeedServlet.AtomNSModule) module;
            root.addNamespaceDeclaration(ATOM_NS);
    
            Element atomLink = new Element("link", ATOM_NS);
            atomNSModule.setLink("http://volgalevel.appspot.com/feed");
            atomLink.setAttribute("href", atomNSModule.getLink());
            atomLink.setAttribute("rel", "self");
            atomLink.setAttribute("type", "application/rss+xml");
    
            channel.addContent(0, atomLink);
            XMLOutputter outputter = new XMLOutputter();
            outputter.output(doc, res.getWriter());
        } catch (FeedException ex) {
            String msg = COULD_NOT_GENERATE_FEED_ERROR;
            log(msg, ex);
            res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg);
        }
    }
    

    注意进口:

    import org.jdom2.Element;
    import org.jdom2.Namespace;
    import org.jdom2.Document;
    import org.jdom2.*;
    import org.jdom2.input.SAXBuilder;
    import org.jdom2.output.XMLOutputter;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    

    实际上可以在那里访问一个有效的RSS GAE Servlet:https://github.com/Eljah/volgalevel/blob/master/src/main/java/com/appspot/FeedServlet.java

    它还修复了重复的pubDate问题

相关问题