2017-07-04 6 views
0

J'essaye d'analyser un XML à partir d'Internet et d'afficher certaines de ses données dans un simple TextView. Voici mon code:SAXParseException: jeton inattendu lors d'une tentative d'analyse XML à distance sur Android

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(); 
    } 
} 

Ce code fonctionne comme prévu quand je le lance sur un fichier local (un de ceux félicité sur InputStreams est un fichier local) mais lorsque je tente de l'exécuter sur le fichier XML à partir Internet, je reçois l'erreur suivante:

07-04 12:58:06.550 23289-23289/mystikos.pollentest W/System.err: org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"[email protected]:990 in [email protected]) 

sur la base des recherches, il semble que l'analyseur ne peut pas dire quel type de codage du fichier XML a, donc je dois le définir. Cependant, je ne suis pas sûr de savoir comment le définir ici ... mes tentatives pour définir l'encodage "UTF-8" sont visibles dans les lignes commentées, mais cela n'a pas fonctionné. Aucune suggestion?

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

Merci!

Répondre

0

Les données que vous obtenez en réponse sont en json, pas en XML. Le préfixe .xml dans votre URL ne prend pas de données au format XML lorsque vous obtenez inputStream depuis UrlOpenConnection et peut être supprimé. Pour voir les données que vous avez:

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

Le résultat est: { "allergyForecast": { "journée0": 4.1, "Jour 1": 3,7, "Day2": 4.6, "Day3": 1.4 » Day4 ": 2.9" ...}

pour analyser ce jour, vous pouvez utiliser Gson par exemple pour analyser le code extrait élément:.

 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"); 

Et que vous pouvez obtenir des valeurs nécessaires à partir JSONObject Ou vous. peut vérifier API comment obtenir une réponse en xml si vous avez seulement besoin de xml