XMLPullParser未找到START_TAG

时间:2018-02-21 09:36:53

标签: android xml xml-parsing xmlpullparser android-xmlpullparser

我正在尝试解析以下网址中的XML数据

Traffic Scotland Current Incidents

现在,我有一个应用程序,按下按钮,获取XML数据,尝试解析它,然后只显示原始xml数据,因为我目前无法解析任何内容。

据我所知,下面的代码应该工作,我不知道为什么它没有。它似乎直接从START_DOCUMENT(eventType 0)到END_DOCUMENT(eventType 1)。

public void onClick(View view)
{
    if (view == ciButton)
        viewCI();

    if (view == prButton)
    {
        viewPR();
    }
}

public void viewCI()
{
    new Thread(new Task(urlCI)).start();
}

public void viewPR()
{
    new Thread(new Task(urlPR)).start();
}

class Task implements Runnable
{
    private String url1;
    private String text;

    Incident incident = null;
    ArrayList<Incident> incidents = null;

    public Task (String aUrl)
    {
        url1 = aUrl;
    }

    @Override
    public void run()
    {
        String inputLine;
        Log.e("MyTag","in run");

        try
        {
            Log.e("MyTag","in try");

            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            URL url = new URL(url1);
            URLConnection uc = url.openConnection();
            InputStreamReader isr = new InputStreamReader(uc.getInputStream());
            BufferedReader in = new BufferedReader(isr);

            int lineNum = 0;
            //Skips first line of XML feed
            while ((inputLine = in.readLine()) != null)
            {
                lineNum++;
                if (lineNum > 1)
                {
                    result = result + inputLine;
                }
            }

            xpp.setInput(uc.getInputStream(),null);

            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT)
            {
                Log.e("MyTag","in while");
                Log.e("MyTag",Integer.toString(eventType));
                if (eventType == XmlPullParser.START_DOCUMENT)
                {
                    Log.e("MyTag","Start Doc");
                }
                else if (eventType == XmlPullParser.START_TAG)
                {
                    String tag = xpp.getName();
                    Log.e("MyTag","Start tag: "+tag);
                }
                else if (eventType == XmlPullParser.END_TAG)
                {
                    String tag = xpp.getText();
                    Log.e("MyTag","End Tag: "+tag);
                }
                else if (eventType == XmlPullParser.TEXT)
                {
                    String tag = xpp.getText();
                    Log.e("MyTag","Text: "+tag);
                }


                Log.e("MyTag","xpp.next");
                eventType = xpp.next();
                Log.e("MyTag","ET after next: "+Integer.toString(eventType));
            }

        }
        catch (XmlPullParserException xppe)
        {
            Log.e("MyTag","XPPE: ");
            xppe.printStackTrace();
        }
        catch (IOException ioe)
        {
            Log.e("MyTag", "IOE");
            ioe.printStackTrace();
        }

        MainActivity.this.runOnUiThread(new Runnable()
        {
            @Override
            public void run() {
                Log.d("UI thread", "I am the UI thread");
                urlInput.setText(result);
            }
        });
    }
}

当我运行上面的代码时,我记录以下内容:

  

02-21 09:17:52.201 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:在运行中
  02-21 09:17:52.232 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:试用中   02-21 09:18:00.092 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:in   而
  02-21 09:18:00.092 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:0
  02-21 09:18:00.092 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:启动文件
  02-21 09:18:00.092 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:   xpp.next
  02-21 09:18:00.092 3258-3572 / com.example.chdick.pullparsertest2 E / MyTag:下一个ET:1

1 个答案:

答案 0 :(得分:1)

xpp.setInput(uc.getInputStream(),null);

这是您第二次使用uc.getInputStream()。您已经阅读了整个流。您已经在String result中获得了整个文档。

您无法再次阅读该流。您无法再次阅读该文档。如果您尝试,它会立即指示流的结束。