0

我在网上搜索了几个小时,但我被困住了。

我使用了一个解析 xml 的教程,我得出的结论是最好使用 DOM xml 解析器。主要是因为我解析的内容只包含 30 项。

xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<sliderlist>
<item>
<urlslide>http://www.google.com</urlslide>
</item>
<item>
<urlslide>http://www.stackoverflow.com</urlslide>
</item>
</sliderlist>

DOM 解析器(大部分来自教程):

TextView urlslide[];


        try {

            URL url = new URL("http://www.mydomain.com/my.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName("item");

            /** Assign textview array lenght by arraylist size */
            urlslide = new TextView[nodeList.getLength()];


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

                Node node = nodeList.item(i);

                urlslide[i] = new TextView(this);


                Element fstElmnt = (Element) node;
                NodeList nameList = fstElmnt.getElementsByTagName("urlslide");
                Element nameElement = (Element) nameList.item(0);
                nameList = nameElement.getChildNodes();
                urlslide[i].setText(((Node) nameList.item(0)).getNodeValue());


                //layout.addView(urlslide[i]);


            }
        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
        }

然后我需要解析内容的部分填充我的数组(现在使用 values/res 文件夹中的 xml):

        mTimer=new CountDownTimer(15000, 1000) {

    String[] myArray = getResources().getStringArray(R.array.testArray);
    //String[] myArray={"http://www.upc.nl/","http://www.google.com","http://www.flyerwall.nl"};    
     //<- String should be read from landingpage.


        int currentIndex=0; 
        public void onTick(long millisUntilFinished) {
             //if (currentIndex<myArray.length) {
                //number.setText("seconds remaining: " +  millisUntilFinished / 1000);
                //currentIndex++;
             //}
        }

        public void onFinish() {
            if (currentIndex<myArray.length) {
                //number.setText("done!");
                mWebView.loadUrl(myArray[currentIndex]);
                currentIndex++;
            } else {
                currentIndex=0;//reset current url to 0
                if (currentIndex<myArray.length)
                //number.setText("done!");
                mWebView.loadUrl(myArray[currentIndex]);
                currentIndex++;
                mTimer.start(); //activate the loop
            }

                mTimer.start();//first time start

        }
     };

我看了这么多示例代码,以至于我不再有任何线索,但我的胆量说它应该很容易完成。

4

3 回答 3

1

与其尝试在一次运行中同时解析 XML 和构建 UI 元素,不如将其拆分为单独的步骤。不仅因为这会简化您的问题(分而治之),还因为您希望在后台线程中执行网络请求和解析 XML 文档,而所有 UI 工作都应该在应用程序的主 ( UI)线程。

不幸的是,我并不完全清楚您遇到的具体步骤。如果它是从 XML 文档中收集实际数据,您应该为代码设置断点并一步一步地检查它,以查看您遇到问题的确切位置。不过,我确实看到了一些简化此步骤的机会。

例如:无需获取<item>...</item>元素列表,只需获取<urlslide>...</urlslide>您感兴趣的元素即可。

NodeList nodeList = doc.getElementsByTagName("urlslide");
List<String> urlList = new ArrayList<String>();

// iterating over nodes omitted... simply add the value of each node to the list
urlList.add(nodeList.item(i).getValue());

那应该给你一个NodeList只包含'urlslide'元素的东西。我假设您最终会希望得到一个 url 列表,因此创建例如 anList<String>来填充节点的值可能是一个想法。如前所述,您不想在主线程上执行任何可能长时间运行的任务,因为这会阻止用户交互并很可能导致臭名昭著的 Android 无响应 (ANR) 消息。因此,我建议您将此逻辑包装在类似AsyncTask.

现在您有了网址,剩下的就是将它们作为列表显示给用户。如果这确实是您所追求的,那么该ListView小部件就是完美的匹配。正如您的代码当前显示的那样,我强烈建议您不要TextView为每个 url 创建一个单独的 URL。使用 an 的好处AsyncTask是它会onPostExecute(...)在后台工作完成后自动调用。这正是ListView用解析的数据填充的正确时间点。

有许多示例(在 SO 和 API 文档中都有)可以向您展示如何使用AsyncTaskListView。如果您需要更多帮助,请尽可能具体地说明您遇到的问题。

于 2012-06-24T23:57:41.537 回答
0

只需将您的文档传递给此函数

private List<string> getSlidesFromDocument(Document doc)
{
    NodeList nodeList = doc.getElementsByTagName("urlslide");
    List<String> slides = new ArrayList<String>();

    for(Node node : nodelist) slides.add(node.getValue());

    return slides;
}
于 2012-06-26T22:02:31.837 回答
0

最后我想通了:

try {

    URL url = new URL("http://www.mydomain.com/my.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(url.openStream()));
    doc.getDocumentElement().normalize();

    NodeList nodeList = doc.getElementsByTagName("item");

    final List<String> urlList = new ArrayList<String>();

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

    Node node = nodeList.item(i);



    Element fstElmnt = (Element) node;
    NodeList nameList = fstElmnt.getElementsByTagName("urlslide");
    Element nameElement = (Element) nameList.item(0);
    nameList = nameElement.getChildNodes();

    urlList.add(((Node) nameList.item(0)).getNodeValue());


    }


    mTimer=new CountDownTimer(15000, 1000) {

    Object[] myArray = urlList.toArray();
    .........more code


    };//CountDownTimer ENDS
    } catch (Exception e) {
        System.out.println("XML Pasing Exception = " + e);
        }
于 2012-06-30T23:04:05.900 回答