0

インターネットから XML を解析し、そのデータの一部を単純な TextView に表示しようとしています。これが私のコードです:

    public class MainActivity extends AppCompatActivity {

    TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1=(TextView)findViewById(R.id.textView1);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        try {

            String UTF8 = "utf-8";
            URL url = new URL("http://pollenapps.com/AllergyAlertWebSVC/api/1.0/Forecast/ForecastForZipCode?Zipcode=02145&Affiliateid=9642&AppID=2.1.0&uid=6693636764.xml");
            URLConnection urlConnection = url.openConnection();
            //InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            //BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
            //InputStream in = new URL("http://pollenapps.com/AllergyAlertWebSVC/api/1.0/Forecast/ForecastForZipCode?Zipcode=02145&Affiliateid=9642&AppID=2.1.0&uid=6693636764.xml").openStream();
            //getAssets().open("file.xml");
            InputStream in = url.openStream();

            //InputStream is2 = new FileInputStream(file);

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            //Document doc = dBuilder.parse(new InputSource(new InputStreamReader(in, "UTF-8")));
            Document doc = dBuilder.parse(in, "UTF-8");
            //Document doc = dBuilder.parse(in);

            Element element = doc.getDocumentElement();
            element.normalize();

            NodeList nList = doc.getElementsByTagName("allergyForecast");

            for (int i=0; i<nList.getLength(); i++) {

                Node node = nList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element2 = (Element) node;
                    tv1.setText(getValue("Day0", element2));
                }
            }

        } catch (Exception e) {e.printStackTrace();}

    }

    private static String getValue(String tag, Element element) {
        NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
        Node node = nodeList.item(0);
        return node.getNodeValue();
    }
}

このコードは、ローカル ファイルで実行すると意図したとおりに動作します (推奨される InputStreams の 1 つはローカル ファイル用です) が、インターネットから XML ファイルで実行しようとすると、次のエラーが発生します。

07-04 12:58:06.550 23289-23289/mystikos.pollentest W/System.err: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"allergyForecas...@1:990 in java.io.InputStreamReader@2ff0997)

いくつかの調査によると、パーサーは XML ファイルのエンコーディングのタイプを判別できないようです。そのため、それを定義する必要があります。ただし、ここで定義する方法がわかりません...「UTF-8」エンコーディングを定義しようとした試みは、コメントアウトされた行に表示されますが、機能しませんでした。助言がありますか?

XML: http://pollenapps.com/AllergyAlertWebSVC/api/1.0/Forecast/ForecastForZipCode?Zipcode=02145&Affiliateid=9642&AppID=2.1.0&uid=6693636764.xml

ありがとうございました!

4

1 に答える 1