在执行此任务时,我遵循http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/中的XML解析教程 非常好的教程。对我来说,一个减号就是从URL中获取XML。我需要从R.raw文件夹中获取。我搜索了解决方案,找到了许多使用InputStream的解决方案(例如:Load local xml data in listview in android) 我已经放了一行代码
InputStream is = res.openRawResource(R.raw.localxmlfileName);
但它正在强调资源并给出错误:[res无法解决]。如何解决这个问题我是否正确行事?
答案 0 :(得分:8)
对于XML,通常更好的选择是将文件放在res/xml/
中,然后通过调用XmlPullParser
获取该XML的getResources().getXml()
。 XmlPullParser
允许您通过XML事件(新文档,新元素等)工作,并阅读您需要的内容。
例如,给定res/xml/words.xml
这样:
<words>
<word value="lorem" />
<word value="ipsum" />
<word value="dolor" />
<word value="sit" />
<word value="amet" />
<word value="consectetuer" />
<word value="adipiscing" />
<word value="elit" />
<word value="morbi" />
<word value="vel" />
<word value="ligula" />
<word value="vitae" />
<word value="arcu" />
<word value="aliquet" />
<word value="mollis" />
<word value="etiam" />
<word value="vel" />
<word value="erat" />
<word value="placerat" />
<word value="ante" />
<word value="porttitor" />
<word value="sodales" />
<word value="pellentesque" />
<word value="augue" />
<word value="purus" />
</words>
你会把它们读成ArrayList<String>
这样的(例如来自活动内部):
ArrayList<String> items=new ArrayList<String>();
XmlPullParser xpp=getResources().getXml(R.xml.words);
while (xpp.getEventType()!=XmlPullParser.END_DOCUMENT) {
if (xpp.getEventType()==XmlPullParser.START_TAG) {
if (xpp.getName().equals("word")) {
items.add(xpp.getAttributeValue(0));
}
}
xpp.next();
}
(那里也有一个try
/ catch
块,但为了简单起见我将其修剪掉了)
优点是存储在res/xml/
中的XML可以这种方式读取,比使用来自InputStream
的{{1}}或来自普通文件的XML解析器快十倍。这是因为Google严格优化了从已知存放XML(res/raw/
,res/xml/
等)的资源目录中读取XML的行为,部分原因是将XML预编译为“二进制XML”格式作为构建过程的一部分。
缺点是较少的开发人员熟悉res/layout/
。
答案 1 :(得分:1)
res
似乎是一个资源变量。您需要先获取资源。尝试使用类似的东西:
InputStream is = getResources().openRawResource(R.raw.localxmlfileName);