0

我使用以下代码读取给定 URL 的 XML 数据,但出现错误,我不知道如何解决。我想阅读给定 URL 的内容,但不是在 HTML 中的 XML 上。任何帮助将不胜感激。

编码 :

package search;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;


public class Process{
    public static void main ( String [] args ) throws IOException{

        URL xmlUrl = new URL("http://www.yahoo.com");
        InputStream in = xmlUrl.openStream();
        Document doc = parse(in);

    }

    public static Document parse (InputStream is) {
        Document ret = null;
        DocumentBuilderFactory domFactory;
        DocumentBuilder builder;

        try {
            domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setValidating(false);
            domFactory.setNamespaceAware(false);
            builder = domFactory.newDocumentBuilder();

            ret = builder.parse(is);
        }
        catch (Exception ex) {
            System.err.println("unable to load XML: " + ex);
        }
        return ret;
    }
}

错误

[Fatal Error] :7:17: The entity "lrm" was referenced, but not declared.
  unable to load XML: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 17; 
  The entity "lrm" was referenced, but not declared.
4

1 回答 1

0

XML 解析的原则之一是输入数据应该是 XML。但是,从您的示例 URL 来看,Yahoo.com 似乎是 HTML5,它不是 XML,甚至不是 SGML 的直接后代(与 HTML 和 XML 不同),因此可能无法被任何常见的解析器解析为 XML。HTTP 可用于返回几乎任何内容类型(HTML、XML、JSON、二进制等),但给出的示例是 HTML。如果您将该示例安装到返回 XML 内容类型的 URL,您的解析错误可能会消失。

如果他们使用 XHTML,您可能会觉得这是符合 XML 结构规则的 HTML,但即便如此,在没有意识到的情况下破坏 XHTML 也太容易了。

即使是常规的 HTML,虽然 SGML 的后代不一定会解析为 XML,因为它可以有非终止标签等。

一般来说,HTML 解析器比 XML 解析器更能容忍与规范的偏差,因此如果您将使用限制在 XHTML 站点上,您仍然会遇到很多解析器故障。

于 2013-05-15T13:37:15.143 回答