确定Feed是Atom还是RSS

时间:2011-09-29 00:11:55

标签: java xml rss atom-feed

我正在尝试确定给定的Feed是基于Atom还是基于RSS。

这是我的代码:

public boolean isRSS(String URL) throws ParserConfigurationException, SAXException, IOException{
        DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();
        Document doc = builder
                .parse(URL);
        return doc.getDocumentElement().getNodeName().equalsIgnoreCase() == "rss";
    }

有更好的方法吗?如果我使用SAX Parser会更好吗?

3 个答案:

答案 0 :(得分:3)

根元素是确定Feed类型的最简单方法。

对于不同的Parsers,有不同的方法来获取根元素。没有人比另一个人差。关于StAX与SAX与DOM等的关系已经有了很多,可以作为特定决策的基础。

前两行代码没有任何问题:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(URL);

在你的return语句中,你在Java String比较中犯了一个错误。

当您使用带有字符串的比较运算符==时,它会比较引用而不是值(即检查两者是否完全相同)。您应该在此处使用equals()方法。只是为了确保我建议使用equalsIgnoreCase()

return doc.getDocumentElement().getNodeName().equalsIgnoreCase("rss");

提示:如果您在isRss()方法中检查“rss”而不是“feed”(例如Atom),则不必使用三元运算符。

答案 1 :(得分:3)

嗅探内容是一种方法。但请注意,atom使用名称空间,并且您正在创建一个非名称空间感知解析器。

public boolean isAtom(String URL) throws ParserConfigurationException, SAXException, IOException{
    DocumentBuilderFactory f = DocumentBuilderFActory.newInstance();
    f.setNamespaceAware(true);
    DocumentBuilder builder = f.newInstance().newDocumentBuilder();
    Document doc = builder.parse(URL);
    Element e = doc.getDocumentElement(); 
    return e.getLocalName().equals("feed") && 
            e.getNamespaceURI().equals("http://www.w3.org/2005/Atom");
}

另请注意,您无法使用equalsIgnorCase()进行比较,因为XML元素名称区分大小写。

另一种方法是对Content-Type标头作出反应,如果它在HTTP GET请求中可用。 ATOM的内容类型为application/atom+xml,RSS为application/rss+xml。但我怀疑,并非所有RSS提要都可以信任,以正确设置此标题。

第三种选择是查看URL后缀,例如.atom和.rss。

如果您使用的是Spring或JAX-RS

,则可以轻松配置最后两种方法

答案 2 :(得分:2)

您可以使用StAX解析器来避免将整个XML文档解析为内存:

public boolean isAtom(String url) throws ParserConfigurationException, SAXException, IOException{
    XMLInputFactory xif = XMLInputFactory.newFactory();
    XMLStreamReader xsr = xif.createXMLStreamReader(new URL(url).openConnection());
    xsr.nextTag();  // Advance to root element
    return xsr.getLocalName().equals("feed") && 
            xsr.getNamespaceURI().equals("http://www.w3.org/2005/Atom");
}