如何从Android中的URL读取XML

时间:2012-10-12 07:59:24

标签: android xml httpurlconnection

我想从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" />

3 个答案:

答案 0 :(得分:2)

这不是XML问题,而是严格的模式问题。 你不应该在Gui Thread中做一些时间紧张的事情,在一个自己的线程中做。

但是,你可以禁用它,但你应该;) see here

答案 1 :(得分: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);
    }

答案 2 :(得分:0)

为什么你不google或在stackoverflow上查找错误?它充满了答案......

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