2017-07-04 6 views
0

インターネットからXMLを解析し、そのデータの一部を単純なTextViewに表示しようとしています。ここに私のコードは次のとおりです。SAXParseException:AndroidでリモートXMLを解析しようとすると予期しないトークンが発生する

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

意図したとおり、私はローカルファイルでそれを実行すると、このコードは動作します(これらのうち表彰、入力ストリームの1がローカルファイルのためです)が、私はからXMLファイルでそれを実行しようとすると、パーサが持つXMLファイルをコードの種類を言うことができないので、私はそれを定義する必要がありますようにそれはそういくつかの研究に基づいて

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]) 

:インターネットは、私は次のエラーを取得します。しかし、私はここでそれを定義する方法がわかりません... "UTF-8"エンコーディングを定義しようとする私の試みは、コメントアウトされた行に表示されますが、それらは機能しませんでした。助言がありますか?

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

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

答えて

0

あなたが応答したデータは、xmlではなくjsonにあります。 URLのプレフィックス.xmlは、UrlOpenConnectionからinputStreamを取得したときにxmlのデータを取得せず、削除することができます。

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

結果は次のとおりです:{ "allergyForecast":{ "Day0":4.1、 "1日目":3.7、 "2日目":4.6、 "3日目":1.4、」あなたが得たデータを表示するには Day4「:2.9、」...}

あなたが例えばGsonを使用することができます日付を解析するためのコードは、要素解析するスニペット:。。

 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だけが必要な場合、xmlで応答を得る方法をAPIで確認できます。

関連する問題