我在网上搜了几个小时,但我被卡住了。
我使用了一个解析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
}
};
我去了那么多样本代码,我不再知道了,但我的胆量说它应该很容易完成。
答案 0 :(得分:1)
您不应尝试解析XML并在单次运行中构建UI元素,而应将其拆分为单独的步骤。不仅因为这会简化您的问题(分而治之),还因为您需要在后台线程中执行netwerk请求和解析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'元素。我假设您最终会想要一个网址列表,因此创建例如网址可能是个好主意。用List<String>
填充节点的值。如上所述,您不希望在主线程上执行任何可能长时间运行的任务,因为这将阻止用户交互,并且很可能导致臭名昭着的Android Not Responding(ANR)消息。因此,我建议你将这个逻辑包含在AsyncTask
之内。
现在您已经拥有了网址,剩下的就是将它们显示为用户的列表。如果这确实是你所追求的,那么ListView
小部件就是完美的匹配。我强烈建议您不要为每个网址创建单独的TextView
,就像您的代码当前显示的那样。使用AsyncTask
的好处是,一旦后台工作完成,它将自动调用onPostExecute(...)
。这正是使用解析数据填充ListView
的正确时间点。
有许多示例(这些都在SO以及API文档中)可以向您展示如何使用AsyncTask
,ListView
等。如果您需要更多帮助,请成为尽可能具体说明你遇到的问题。
答案 1 :(得分: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;
}
答案 2 :(得分: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);
}