1

次の URL を解析しようとしています: http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2

コード:

//using jdom SAX parser
SAXBuilder builder = new SAXBuilder();
URL url = new URL("http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2");
InputStream in = getInputStrem(url);
Document document = builder.build(in); ...

getInputStream():

public static InputStream getInputStrem(URL url) {
    InputStream in = null;
    try {
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.connect();
        in = con.getInputStream();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return in;
}

例外「3 行目のエラー: 3 行目の 29 列目: 整形式ではありません (無効なトークン)」

次の行を実行しようとすると取得されます:

Document document = builder.build(in)  

問題は getInputStream() 関数にあると思いますが、

Url をより単純なもの (パラメーターと古典的な構造なし) に置き換えると、正常に動作するためです。

4

3 に答える 3

1

ファイルからの読み取りと同じ問題がありましたが、これで解決しました:

File file = new File("/somewhere/somefile.xml"); 
FileInputStream stream = new FileInputStream(file), "UTF-8");
Reader reader = new BufferedReader(new InputStreamReader(stream));

SAXBuilder builder = new SAXBuilder();           
Document doc = builder.build(reader);

あなたの場合、おそらく次のような URL からストリームを取得します。

InputStream stream = new URL("http://www.somewhere.com/somefile.xml").openStream();
Reader reader = new BufferedReader(new InputStreamReader(stream));

SAXBuilder builder = new SAXBuilder();           
Document doc = builder.build(reader);

最後のリソースとして (エンコードは Url::openStream() で強制できないため)、データをローカルに保存してから、最初の例のようにファイル ストリームで開きます。

于 2012-12-03T13:04:58.463 に答える
1

おそらく文字エンコードの問題です。あなたが得ているエラーは、おそらく InputStream が実際のデータとは異なる文字セットで解釈されているためです。

URL には入力ストリームがありますが、文字セットもあります。ストリームを JDOM に提供するときは、その文字セットを無視しています。

最初に試みるべきことは、すべての getInputStream コードを削除することです。JDOM には単純な SAXBuilder.build(URL) メソッドがあり、そのメソッドはストリームと文字セットの両方を考慮します...

そのようにして、コード全体を簡素化できます。実際、JDOM に string 引数を与えると、それは URL (SystemID) として解釈されるため、コードは次のように単純になります。

SAXBuilder builder = new SAXBuilder();
Document document = builder.build("http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2");

編集: - -

さて、私は自分の環境で「自分の」バージョンのコードを実行し、(パーサーとして Xerces を使用して) 問題の詳細を取得しました....:

Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.
    at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
    at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.scanContent(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanContent(Unknown Source)
    ... 11 more

したがって、入力データが正しくエンコードされていないようです....

もう一度編集:

入力ドキュメントに対する xmllint の出力を次に示します。xmllint は、ほとんどの Linux ディストリビューションで使用できる UNIX プログラムです。これは、XML を検証する優れた「客観的な」方法を提供します。

david.xml:3: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xEE 0xF1 0xE5 0xF3
<option value="22958">22958: îñåó øéãéðâ</option><option value="22920">22920: ãé
                             ^

本当に、壊れた XML ドキュメントがあります。それでもどうしてもという場合は、エラーを無視するエラー ハンドラを JDOM の SAXBuilder に追加できますここでJDOM のドキュメントを参照してください: http://www.jdom.org/docs/apidocs/org/jdom2/input/SAXBuilder.html#setErrorHandler%28org.xml.sax.ErrorHandler%29問題。(エラーメソッドをオーバーライドし、例外をスローする代わりに戻ります).....問題は報告されず、パーサーは「続行」します、解析結果のデータが欠落します....

于 2012-05-14T09:42:32.297 に答える
0

HTTPリクエストからのXML応答テキストは整形式ではありません。最初に検証してみてください。したがって、例外です。

于 2012-05-14T05:38:44.243 に答える