Java:解析RSS源时出错

Java:解析RSS源时出错,java,xml,rss,Java,Xml,Rss,在下面,您可以看到代码 public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); factory.setIgnoringElementContentWhitespace(true);

在下面,您可以看到代码

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));
        }

    }
publicstaticvoidmain(字符串[]args)引发异常{
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
工厂设置验证(true);
setIgnoringElementContentWhitespace(true);
DocumentBuilder=factory.newDocumentBuilder();
Document doc=builder.parse(“http://rss.adnkronos.com/RSS_Politica.xml");
NodeList节点=doc.getElementsByTagName(“标题”);
对于(int k=0;k
RSS源的链接如下所示:

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

空空空空空空空空空空空空空空空空 空空空空空空空空空

正如您在xml中看到的,节点标题的值显然不是null

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

错误:URI=Line=1:根 元素“rss”必须与根DOCTYPE“null”匹配

错误:URI=Line=1:文档 无效:未找到语法


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

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

有两个问题。让我们先来处理一个你可能最关心的问题

节点列表中的节点是元素节点。实际的文本节点是它们的子节点。因此,要获得所需的值,可以执行以下操作:

nodes.item(k).getFirstChild().getNodeValue()
或者(在这种情况下):

就我个人而言,我认为前者在进行常规解析时更为健壮,因为getTextContent()将连接来自所有子节点的所有文本内容(如果恰好有多个)

至于验证错误,在默认情况下,当您执行setValidating(true)时,它会查找一个嵌入的DTD,而该DTD不在那里,它会向您抱怨。tl;dr正在进行设置验证(错误)


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

有两个问题。让我们先来处理一个你可能最关心的问题

节点列表中的节点是元素节点。实际的文本节点是它们的子节点。因此,要获得所需的值,可以执行以下操作:

nodes.item(k).getFirstChild().getNodeValue()
或者(在这种情况下):

就我个人而言,我认为前者在进行常规解析时更为健壮,因为getTextContent()将连接来自所有子节点的所有文本内容(如果恰好有多个)

至于验证错误,在默认情况下,当您执行setValidating(true)时,它会查找一个嵌入的DTD,而该DTD不在那里,它会向您抱怨。tl;dr正在进行设置验证(错误)

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