【问题标题】:How to reading XML from a URL in Android如何从 Android 中的 URL 读取 XML
【发布时间】:2012-10-12 07:59:23
【问题描述】:

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

我在 ma​​nifest 文件中添加了使用权限:

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

【问题讨论】:

  • 搜索。这个问题到处都有数百个答案。

标签: android xml httpurlconnection


【解决方案1】:

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

然而,你可以禁用它,但你不应该;) see here

【讨论】:

    【解决方案2】:

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

    1.发出HTTP请求从webservice获取数据 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);
        }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多