2013-12-11 3 views
0

Я пытаюсь получить некоторые данные из веб-службы в приложении для Android.Извлечение xml из webservice - Android

код, я использую это:

@Override 
protected String doInBackground(String... params) { 

    String highScore = null; 
    int points = 0; 

    try { 
     URI uri = new URI("http://vestsoft.somee.com/api/scores"); 
     URL website = new URL(uri.toASCIIString());    

     InputStream inputStream = website.openStream(); 
     InputSource input = new InputSource(inputStream); 

     SAXParserFactory saxp = SAXParserFactory.newInstance(); 
     SAXParser sp = saxp.newSAXParser(); 
     XMLReader xmlReader = sp.getXMLReader(); 

     HighScoreHandler handler = new HighScoreHandler(); 
     xmlReader.setContentHandler(handler); 

     xmlReader.parse(input); // Here is an exception thrown 

     highScore = handler.highScore.getUserName(); 
     points = handler.highScore.getPoints(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return highScore + " " + points; 
} 

я получаю исключение, говоря:
«В строке 1, столбец 0: ошибка синтаксиса»

Я не знаю, что я делать неправильно.
Как вы можете видеть, API я получаю мои данные есть:
http://vestsoft.somee.com/api/scores

+0

Можно ли вставить всю трассировку стека? Я предполагаю, что XML не хорошо отформатирован. – CodeChimp

+0

Как это получить? В "Java Stack Trace Console" нет ничего. – FlipEX

+0

Я думаю, вам нужно фактически загрузить/прочитать данные сначала в буфер, прежде чем вы сможете его разобрать. –

ответ

0

Ваш XML отсутствует правильный заголовок:

<?xml version="1.0" encoding="UTF-8"?> 

Поместить эту строку в верхней части файла XML и SAX Parser перестанет беспокоить.

0

Есть несколько действительно хороших инструментов для разбора XML с открытым исходным кодом, чтобы сделать это намного проще. Например, чтобы решить эту проблему с Simple XML, я хотел бы сделать это следующим образом:

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.simpleframework.xml.Serializer; 
import org.simpleframework.xml.core.Persister; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

import com.squareup.okhttp.OkHttpClient; 

public class MainActivity extends Activity { 

    public static final String TAG = MainActivity.class.getSimpleName(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button b = (Button) findViewById(R.id.button1); 
     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Runnable r = new Runnable() { 

        @Override 
        public void run() { 

         try { 
          URL website = new URL("http://vestsoft.somee.com/api/scores"); 

          OkHttpClient client = new OkHttpClient(); 
          HttpURLConnection conn = client.open(website); 
          conn.addRequestProperty("Accept", "application/xml"); 
          InputStream stream = conn.getInputStream(); 

          Serializer serializer = new Persister(); 
          ArrayOfScore scoreArray = serializer.read(ArrayOfScore.class, stream); 

          // do something with the ArrayScore object here 

         } catch (Exception err) { 
          Log.i(TAG, err.toString()); 
         } 
        } 
       }; 

       new Thread(r).start(); 
      } 
     }); 

    } 
} 

Это ссылается на два других классах, в XML аннотированных классов Java. К ним относятся:

import java.util.List; 
import org.simpleframework.xml.ElementList; 
import org.simpleframework.xml.Root; 

@Root 
public class ArrayOfScore { 

    @ElementList(inline=true,required=false) 
    private List<Score> scores; 

    public List<Score> getScores() { 
     return scores; 
    } 

} 

И:

import org.simpleframework.xml.Element; 
import org.simpleframework.xml.Root; 

@Root(name="Score") 
public class Score { 

    @Element(name="Id",required=false) 
    Integer Id; 
    @Element(name="Name",required=false) 
    String Name; 
    @Element(name="Points",required=false) 
    String Points; 
    @Element(name="dateTime",required=false) 
    String dateTime; 
} 

С помощью этой простой модели можно разобрать практически любой XML вы столкнулись и получить разбор в первые объекты класса автоматически. Существуют аналогичные классы для JSON, такие как Gson

Смежные вопросы