1

我正在编写一个使用 asmx 调用 Web 服务的 Android 应用程序。我想要的 JSON 响应在 xml 中,所以我试图提取一个名为“string”的标签,这就是 JSON 所在的位置。我得到了上述异常。

我已经完成了一些日志记录,并且得到了一个流,所以 url 可以正常传递。异常发生在 parser.nextTag() 上。这是文件并打印出来。有任何想法吗?谢谢。

public class MainActivity extends Activity {

    private static final String TAG = MainActivity.class.getSimpleName();
     private static final String URL = "http://212.169.27.217:84/rotaservice.asmx/GetRota?CarerID=36&RotaDate=04-09-2012";
     TextView tv = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textview1);
        Log.e(TAG, "about run DownloadXmlTask");
        new DownloadXmlTask().execute(URL);
        Log.e(TAG, "finished running DownloadXmlTask");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


    private class DownloadXmlTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {
            try {
                Log.e(TAG, "url = " + urls[0].toString());
                return loadXmlFromNetwork(urls[0]);
            } catch (IOException e) {
               e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            setContentView(R.layout.activity_main);
            // Displays the HTML string in the UI via a WebView
           tv.setText(result);
        }
    }

    private String loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
        InputStream stream = null;
        XmlParser xmlParser = new XmlParser();
        List<WebServiceString> entries = null;
        String string = null;





        try {
            stream = downloadUrl(urlString);
            Log.e(TAG, "stream = " + stream.toString());
            entries = xmlParser.parse(stream);
        // Makes sure that the InputStream is closed after the app is
        // finished using it.
        } finally {
            if (stream != null) {
                stream.close(); 
            }
        }


        for (WebServiceString entry : entries) {
           Log.e("main", "WebserviceString  = " + entry.toString());
           string = entry.toString();
        }
        return string;


    }

 // Given a string representation of a URL, sets up a connection and gets
    // an input stream.
    private InputStream downloadUrl(String urlString) throws IOException {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        InputStream stream = conn.getInputStream();
        return stream;
    }
}// end of class

.

public class XmlParser {

    private static final String TAG = XmlParser.class.getSimpleName();
        // We don't use namespaces
        private final static String ns = null;

        public List parse(InputStream in) throws XmlPullParserException, IOException {
            try {
                XmlPullParser parser = Xml.newPullParser();
                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                parser.setInput(in, null);
                parser.nextTag();
                Log.e(TAG, "nextTag = " + parser.nextTag());
                return readFeed(parser);
            } finally {
                in.close();
            }
        }

        private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
            List string = new ArrayList();

           // parser.require(XmlPullParser.START_TAG, ns, "feed");
            while (parser.next() != XmlPullParser.END_TAG) {
                if (parser.getEventType() != XmlPullParser.START_TAG) {
                    continue;
                }
                String name = parser.getName();
                // Starts by looking for the entry tag
                if (name.equals("string")) {
                    string.add(readString(parser));
                } else {
                    skip(parser);
                }
            }  
            return string;
        }





        public static class WebServiceString {

        public final String string;


        private WebServiceString(String string ) {
            this.string = string;

        }

        }



    // Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them off
    // to their respective "read" methods for processing. Otherwise, skips the tag.
    private WebServiceString readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
        parser.require(XmlPullParser.START_TAG, ns, "string");
        String string = null;

        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
            if (name.equals("string")) {
                string = readString(parser);
            }  else {
                skip(parser);
            }
        }
        return new WebServiceString(string);
    }



    private String readString(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG,  ns, "string");
        String string = readText(parser);
        parser.require(XmlPullParser.END_TAG,  ns, "string");
        return string;
    }



    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (parser.next()) {
            case XmlPullParser.END_TAG:
                depth--;
                break;
            case XmlPullParser.START_TAG:
                depth++;
                break;
            }
        }
     }



    private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
        String result = "";
        if (parser.next() == XmlPullParser.TEXT) {
            result = parser.getText();
            parser.nextTag();
        }
        return result;
    }




    }

.

09-04 13:20:51.890: E/MainActivity(12076): about run DownloadXmlTask
09-04 13:20:51.900: E/MainActivity(12076): finished running DownloadXmlTask
09-04 13:20:51.900: E/MainActivity(12076): url = http://212.169.27.217:84/rotaservice.asmx/GetRota?CarerID=36&RotaDate=04-09-2012
09-04 13:20:52.200: D/libEGL(12076): loaded /system/lib/egl/libEGL_tegra.so
09-04 13:20:52.280: D/libEGL(12076): loaded /system/lib/egl/libGLESv1_CM_tegra.so
09-04 13:20:52.290: D/libEGL(12076): loaded /system/lib/egl/libGLESv2_tegra.so
09-04 13:20:52.330: D/OpenGLRenderer(12076): Enabling debug mode 0
09-04 13:20:52.410: E/MainActivity(12076): stream = libcore.net.http.FixedLengthInputStream@40d80638
09-04 13:20:52.610: W/System.err(12076): org.xmlpull.v1.XmlPullParserException: unexpected type (position:TEXT {"0":{"StartDate...@2:8360 in java.io.InputStreamReader@40d85e20) 
09-04 13:20:52.610: W/System.err(12076):    at org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:2035)
09-04 13:20:52.610: W/System.err(12076):    at com.carefreegroup.XmlParser.parse(XmlParser.java:30)
09-04 13:20:52.610: W/System.err(12076):    at com.carefreegroup.MainActivity.loadXmlFromNetwork(MainActivity.java:80)
09-04 13:20:52.610: W/System.err(12076):    at com.carefreegroup.MainActivity.access$1(MainActivity.java:67)
09-04 13:20:52.610: W/System.err(12076):    at com.carefreegroup.MainActivity$DownloadXmlTask.doInBackground(MainActivity.java:50)
09-04 13:20:52.610: W/System.err(12076):    at com.carefreegroup.MainActivity$DownloadXmlTask.doInBackground(MainActivity.java:1)
09-04 13:20:52.610: W/System.err(12076):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-04 13:20:52.610: W/System.err(12076):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-04 13:20:52.610: W/System.err(12076):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-04 13:20:52.620: W/System.err(12076):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
09-04 13:20:52.620: W/System.err(12076):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-04 13:20:52.620: W/System.err(12076):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-04 13:20:52.620: W/System.err(12076):    at java.lang.Thread.run(Thread.java:864)

.

09-04 13:39:44.950: I/RestClient(14037): <?xml version="1.0" encoding="utf-8"?>
09-04 13:39:44.950: I/RestClient(14037): <string xmlns="http://tempuri.org/">{"0":{"StartDate":"04/09/2012 07:30:00","EndDate":"04/09/2012 07:50:00","Duration":"20","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Brown","ClientForename":"Margaret","NeedName":"Assist With Dressing, Careline, Diabetic Type 2, Empty Commode, KEY SAFE, Leave A Drink, Make A Hot Drink, Meds - Level II Administer, Prepare Breakfast, Strip Wash, TIME BAND - Early Breakfast","CarerAwayReason":"","CallID":"7862d5a1-4cc3-4931-bb76-b23f723087b9","DoubleUpCallID":"","ActualTimeIn":"07:51","ActualTimeOut":"07:53"},"1":{"StartDate":"04/09/2012 07:30:00","EndDate":"04/09/2012 07:55:00","Duration":"25","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Ebbs","ClientForename":"Vera","NeedName":"Assist With Dressing, Laundry, Leave A Drink, Leave A Sandwich For Later, Make A Hot Drink, Prepare Breakfast, Shower, TIME BAND - Early Breakfast","CarerAwayReason":"","CallID":"5e6f77b5-651b-4e4a-9876-0a52192a7b47","DoubleUpCallID":"","ActualTimeIn":"07:25","ActualTimeOut":"07:40"},"2":{"StartDate":"04/09/2012 08:00:00","EndDate":"04/09/2012 08:40:00","Duration":"40","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Weaver","ClientForename":"Margaret","NeedName":"KEY SAFE, Morning Call - Get Up And Breakfast, Personal Care","CarerAwayReason":"","CallID":"286bee6d-3994-4785-998f-7ea02bd871c4","DoubleUpCallID":"","ActualTimeIn":"08:19","ActualTimeOut":"08:59"},"3":{"StartDate":"04/09/2012 08:08:00","EndDate":"04/09/2012 00:00:00","Duration":"0","CallStatusID":"0","CallStatusName":"Unknown or incomplet","ClientSurname":"Brown","ClientForename":"Margaret","NeedName":"","CarerAwayReason":"","CallID":"d02a6072-bbdd-481d-b9da-f057180ce2ea","DoubleUpCallID":"","ActualTimeIn":"08:08","ActualTimeOut":"00:00"},"4":{"StartDate":"04/09/2012 09:00:00","EndDate":"04/09/2012 09:20:00","Duration":"20","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Howarth","ClientForename":"Edith","NeedName":"Change Incontinence Pads, KEY SAFE, Make Bed / Change As Neccessary, Meds - Level II Administer, Personal Care, Prepare Breakfast, TIME BAND - Late Breakfast","CarerAwayReason":"","CallID":"3199a956-647e-4737-9ca3-fea6356f807e","DoubleUpCallID":"","ActualTimeIn":"09:43","ActualTimeOut":"10:19"},"5":{"StartDate":"04/09/2012 09:00:00","EndDate":"04/09/2012 09:50:00","Duration":"50","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Kastik","ClientForename":"Lydia","NeedName":"Keys Needed, Leave A Drink, Leave A Sandwich For Later, Make A Hot Drink, Make Bed / Change As Neccessary, Medication Prompt, Meds - Level II Administer, Personal Care, Shower, TIME BAND - Early Breakfast","CarerAwayReason":"","CallID":"71fd1754-9f15-4898-90cf-3af5c0c06e6e","DoubleUpCallID":"","ActualTimeIn":"09:07","ActualTimeOut":"09:35"},"6":{"StartDate":"04/09/2012 10:30:00","EndDate":"04/09/2012 11:00:00","Duration":"30","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Terett","ClientForename":"Mamie","NeedName":"Assist With Dressing, Meds - Self Medicating, Morning Call, Personal Care, Strip Wash, TIME BAND - Late Breakfast","CarerAwayReason":"","CallID":"84fb31f7-507d-4a6b-a1d4-ae1ca5122a35","DoubleUpCallID":"","ActualTimeIn":"10:26","ActualTimeOut":"11:37"},"7":{"StartDate":"04/09/2012 12:00:00","EndDate":"04/09/2012 12:15:00","Duration":"15","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Garland","ClientForename":"Mavis","NeedName":"Empty Catheter Bag, Medication Prompt, Meds - Level II Administer, TIME BAND - Early Lunch, Toiletting / Commode","CarerAwayReason":"","CallID":"d36d8bcf-8993-4529-99bb-9b16798f1dfe","DoubleUpCallID":"","ActualTimeIn":"11:51","ActualTimeOut":"12:07"},"8":{"StartDate":"04/09/2012 12:30:00","EndDate":"04/09/2012 12:50:00","Duration":"20","CallStatusID":"1","CallStatusName":"Completed","ClientSurname":"Weaver","ClientForename":"Margaret","NeedName":"KEY SAFE, Lunch Call, Make A Hot Drink, Make Lunch","CarerAwayReason":"","CallID":"6cc0c046-79a8-4
4

0 回答 0