1

JDOM2を使用して解析しようとする有効なXMLファイル(ブラウザが解析できる正当な理由)があります。コードは他の xml ファイルでは正常に動作していましたが、この特定の xml ファイルでは、builder.build() 行で次の例外が発生します。 3 バイトの UTF-8 シーケンスの 3。"

私のコードは次のとおりです

    import java.io.*;
    import java.util.*;
    import java.net.*;
    import org.jdom2.*;
    import org.jdom2.input.*;
    import org.jdom2.output.*;
    import org.jdom2.adapters.*;

    public class Test
    {
        public static void main(String st[])
        {
            String results="N.A.";
            SAXBuilder builder = new SAXBuilder();
            Document doc;
            results = scrapeSite().trim();

                    try
                    {
                        doc = builder.build(new ByteArrayInputStream(results.getBytes()));
                    }
                    catch(JDOMException e)
                    {
                        System.out.println(e.toString());
                    }
                    catch(IOException e)
                    {
                        System.out.println(e.toString());
                    }
        }


        public static String scrapeSite()
        {
            String temp="";
            try
            {
                URL url = new URL("http://msu-footprints.org/2011/Aditya/search_5.xml");
                URLConnection conn = url.openConnection();
                conn.setAllowUserInteraction(false);
                InputStream urlStream = url.openStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(urlStream));

                String t = br.readLine();
                while(t!=null)
                {
                    temp = temp + t;
                    t = br.readLine();
                }
            }
            catch(IOException e)
            {
                System.out.println(e.toString());
            }

            return temp;
        }
    }
4

2 に答える 2

1

Reader を使用して xml を文字列に読み込むのはなぜですか? 解析する前にxmlを破損しています。xml を文字ではなくバイトとして扱います。

また、別の ByteArrayInputStream に変換するためだけに URL InputStream 全体を読み取るのはなぜですか? URL InputStream をビルダーに直接渡すことで、約 2 行のコードに減らすことができます。(ストリーム全体をメモリに読み込むことによって引き起こされる追加のメモリの問題を回避することは言うまでもありません)。

于 2013-02-15T00:44:47.077 に答える
0

jtahlborn が指摘しているように、XML は常にバイトとして扱い、パーサーがエンコーディングを処理できるようにする必要があります。

しかしそれ以上に、文字列のバイトを取得するために String.getBytes() を決して使用しないでください。自分が思っているものを取得することはできません。

この場合、サイトのバイトを取得するだけで済みますが、XML を文字列で構築し、それをバイト シーケンスとしてパーサーに渡す (または、より可能性が高いのは、バイトをファイルに書き込む) 場合でも、 XML が示すエンコーディング (デフォルトでは UTF-8) と一致するようにエンコーディングを指定したい:

byte[] bytes = myString.getBytes("UTF-8");

同様に、何らかの理由で Writer または Reader を使用する必要がある場合は、書き込みまたは読み取りのエンコーディングを指定する必要があります。

XML を作成する必要がある場合は、XMLStreamWriter クラスを使用することをお勧めします。

ByteArrayOutputStream outStream = new ByteArrayOutputStream();
XMLStreamWriter writer = 
   XMLOutputFactory.newInstance().createXMLStreamWriter(outStream);
于 2013-03-02T13:26:46.713 に答える