【问题标题】:Java: error while parsing a RSS feedJava:解析 RSS 提要时出错
【发布时间】:2018-04-18 16:51:31
【问题描述】:

您可以在下面看到代码。

public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);
        factory.setIgnoringElementContentWhitespace(true);
        DocumentBuilder builder = factory.newDocumentBuilder();

        Document doc = builder.parse("http://rss.adnkronos.com/RSS_Politica.xml");

        NodeList nodes = doc.getElementsByTagName("title");

        for(int k=0; k < nodes.getLength(); k++) {
            System.out.print(nodes.item(k));
        }

    }

RSS提要的链接如下:http://rss.adnkronos.com/RSS_Politica.xml

结果(在控制台中)如下:

null null null null null null null null null null null null null null null null null null null null

你可以在xml中看到,节点标题的值显然不是空的。

结果之后,显示以下错误(翻译自意大利语)。

错误:URI=http://rss.adnkronos.com/RSS_Politica.xml Line=1:根 元素“rss”必须匹配根 DOCTYPE“null”。

错误:URI=http://rss.adnkronos.com/RSS_Politica.xml Line=1:文档 无效:找不到语法。

【问题讨论】:

    标签: java xml rss


    【解决方案1】:

    有两个问题。让我们先处理您可能最关心的那个。

    您的 NodeList 中的节点是 Element 节点。实际的 Text 节点是它们的子节点。所以要得到你想要的值,你可以这样做:

    nodes.item(k).getFirstChild().getNodeValue()
    

    或者(在这种情况下):

    nodes.item(k).getTextContent()
    

    我个人认为前者在进行一般解析时稍微健壮一些,因为如果恰好有多个子节点,getTextContent() 将连接所有子节点的所有文本内容。

    至于验证错误,默认情况下,当您执行 setValidating(true) 时,它正在寻找一个不存在的嵌入式 DTD,它会向您抱怨它。 tl;dr 是 setValidating(false)。

    如果您真的想要验证 RSS,您应该尝试找到一个非官方的(因为没有官方的)XSD 架构文件并在您的 DocumentBuilderFactory 中进行设置。不过,在这种情况下为 RSS 使用 XSD 可能不值得,因为 Internet 上一半的 RSS 虽然完全可用,但可能无法通过验证:)。

    【讨论】:

      【解决方案2】:

      查看您遇到的错误的验证选项。 就标题的 null 而言,Node 上的 toString 似乎只是返回 null 或者做了一些刚刚得到 null 的事情。如果您将其更新为System.out.print(nodes.item(k).getTextContent());,它将打印出标题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        相关资源
        最近更新 更多