我正在开发我的第一个 Android 应用程序,我正在尝试使用 DOM 解析器解析 XML 文件。我正在使用绝对文件路径,但编译器仍然找不到我的文件,我不确定为什么。
这是 LogCat 给我的消息。 (注意:我使用的是 Mac。)
03-10 11:52:16.427: W/System.err(929): java.io.FileNotFoundException: /Users/leedownen/Desktop/AndroidApp/AssignmentGrabber/src/mus/school/tools/assignmentsbystudent.xml (No such file or directory)
package mus.school.tools;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
public class AssignmentGrabberActivity extends Activity {
class Async extends AsyncTask<String, Void, String>
{
private String results = "";
@Override
protected String doInBackground(String... url) {
String myURL = url[0];
try {
File fXmlFile = new File(myURL);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
//System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("staff");
//System.out.println("-----------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
results = results + "\n" + ("Class : " + getTagValue("ClassName", eElement)) +
("Period : " + getTagValue("period", eElement))
+ ("Day : " + getTagValue("Day", eElement));
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return results;
}
@Override
protected void onPostExecute(String results)
{
this.results = results;
}
private String getTagValue(String sTag, Element eElement)
{
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();
}
public String getResults()
{
return results;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = new TextView(this);
Async myAsync = new Async();
myAsync.execute("/Users/leedownen/Desktop/AndroidApp/AssignmentGrabber/src/mus/school/tools/assignmentsbystudent.xml");
tv.setText(myAsync.getResults());
setContentView(tv);
}
}
最佳答案
我不明白如何在 Android 应用程序中使用桌面的绝对文件路径? 模拟器和您的手机都无法从应用程序中访问该文件,因此从逻辑上讲它不起作用。
您应该将您的文件添加到 res 目录或 assets 目录并学习访问它们。
此外,您错误地使用了 AsyncTask
。您无法在 onCreate 中获取结果,因为您启动了后台任务,并立即尝试获取结果。您还应该在 AsyncTask
的 onPostExecute
方法中设置该文本。这将在任务完成后运行。
关于安卓应用找不到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9648872/