【问题标题】:SAXParseException: Unexpected token when trying to parse remote XML on AndroidSAXParseException:尝试在 Android 上解析远程 XML 时出现意外令牌
【发布时间】:2017-07-04 17:03:49
【问题描述】:

我正在尝试从 Internet 解析 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 用于本地文件),此代码按预期工作,但是当我尝试在 Internet 上的 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

谢谢!

【问题讨论】:

    标签: java android xml saxparser saxparseexception


    【解决方案1】:

    您在响应中获得的数据是 json 格式,而不是 xml 格式。当您从 UrlOpenConnection 获取 inputStream 时,您的 url 中的前缀 .xml 不会在 xml 中获取数据,并且可以删除。 要查看您获得的数据:

            String data = "";
            while (in.available() > 0)
                data += (char)in.read();
            System.out.println(data);
    

    结果是:{"allergyForecast":{"Day0":4.1,"Day1":3.7,"Day2":4.6,"Day3":1.4,"Day4":2.9," ... }

    例如,要解析日期,您可以使用 Gson。代码 sn-p 解析元素:

            JsonElement jelement = new JsonParser().parse(new InputStreamReader(in));
         // or from readed from inputStream string:
         // JsonElement jelement = new JsonParser().parse(data);
            JsonObject jobject = jelement.getAsJsonObject();
            jobject = jobject.getAsJsonObject("allergyForecast");
    

    而且你可以从 jsonObject 中获取所需的值。 或者,如果您只需要 xml,您可以查看 API 如何在 xml 中获取响应。

    【讨论】:

      猜你喜欢
      • 2013-10-17
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多