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 構文解析の原則の 1 つは、入力データは XML でなければならないということです。ただし、URL の例から、Yahoo.com は HTML5 のように見えます。これは XML ではなく、(HTML や XML とは異なり) SGML の直接の子孫でさえないため、一般的に見つかったパーサーによって XML として解析できない可能性があります。HTTP を使用して、ほぼすべてのコンテンツ タイプ (HTML、XML、JSON、バイナリなど) を返すことができますが、ここで示す例は HTML です。この例を、XML のコンテンツ タイプを返す URL に設定すると、解析エラーは解消される可能性があります。

XHTML を使用している場合、それは XML 構造規則に準拠した HTML であるため、おそらく問題ありませんが、それでも XHTML は気付かないうちに簡単に壊れてしまいます。

通常の HTML でさえ、終了していないタグなどを持つことができるため、SGML の子孫は必ずしも XML として解析するとは限りません。

一般に、HTML パーサーは XML パーサーよりも仕様からの逸脱に対してはるかに寛容であるため、使用を XHTML サイトだけに制限した場合でも、多くのパーサー エラーが発生します。

于 2013-05-15T13:37:15.143 に答える