2

我想从URL读取 XML 文档:

public void DownloadXmlFile() throws IOException{
        //TODO
        String url = "http://api.m1858.com/coursebook.xml";
        URL u = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) u.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
    }

我得到一个错误异常

android.os.NetworkOnMainThreadException

我在清单文件中添加了使用权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
4

3 回答 3

2

这不是 XML 问题,而是严格模式问题。你不应该在 Gui Thread 中做时间密集的事情,在自己的 Thread 中做。

但是,您可以禁用它,但您不应该;) 请参见此处

于 2012-10-12T08:00:42.927 回答
2

从服务器读取数据有两个步骤...

1.发出 HTTP 请求以从 Web 服务获取数据 2.解析 XML 文档并读取内容

try 
    {

        URL url = new URL("http://www.w3schools.com/xml/note.xml");

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(url.openStream()));
        doc.getDocumentElement().normalize();

        NodeList nodeList = doc.getElementsByTagName("note");
        /** Assign textview array lenght by arraylist size */


        to = new TextView[nodeList.getLength()];
        from = new TextView[nodeList.getLength()];
        heading = new TextView[nodeList.getLength()];
        body = new TextView[nodeList.getLength()];



        for (int i = 0; i < nodeList.getLength(); i++) 
        {
            Node node = nodeList.item(i);

            to[i] = new TextView(this);
            from[i] = new TextView(this);
            body[i] = new TextView(this);
            heading[i] = new TextView(this);

            Element fstElmnt = (Element) node;
            NodeList toList = fstElmnt.getElementsByTagName("to");
            Element nameElement = (Element) toList.item(0);
            toList = nameElement.getChildNodes();
            to[i].setText("To = "+ ((Node) toList.item(0)).getNodeValue());

            NodeList fromList = fstElmnt.getElementsByTagName("from");
            Element fromElement = (Element) fromList.item(0);
            fromList = fromElement.getChildNodes();
            from[i].setText("from = "+ ((Node) fromList.item(0)).getNodeValue());

            NodeList headingList = fstElmnt.getElementsByTagName("heading");
            Element headingElement = (Element) headingList.item(0);
            headingList = headingElement.getChildNodes();
            heading[i].setText("heading = "+ ((Node) headingList.item(0)).getNodeValue());


            NodeList bodyList = fstElmnt.getElementsByTagName("body");
            Element bodyElement = (Element) bodyList.item(0);
            bodyList = bodyElement.getChildNodes();
            body[i].setText("body = "+ ((Node) bodyList.item(0)).getNodeValue());

            layout.addView(to[i]);
            layout.addView(from[i]);
            layout.addView(heading[i]);
            layout.addView(body[i]);

        }
    } 
    catch (Exception e) 
    {
        System.out.println("XML Pasing Excpetion = " + e);
    }
于 2012-10-12T10:02:15.747 回答
0

为什么你不谷歌或在 stackoverflow 上查找错误?满是答案...

您必须扩展 AsyncTask 以避免阻塞 GUI,并在后台执行此类操作(如下载或解析内容)。

于 2012-10-12T08:01:31.233 回答