在Android中从res/XML打开XML文件
我创建了一个Java应用程序,它打开一个xml文件,如下所示:在Android中从res/XML打开XML文件,android,xml,file,local,saxparser,Android,Xml,File,Local,Saxparser,我创建了一个Java应用程序,它打开一个xml文件,如下所示: 犬的 蓝色 我可以使用以下方法打开它: File fXmlFile=getResources.getXml(“res/xml/data.xml”); DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder=dbFactory.newDocumentBuilder(); documentdoc=d
犬的
蓝色
我可以使用以下方法打开它:
File fXmlFile=getResources.getXml(“res/xml/data.xml”);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
documentdoc=dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList animalNodes=doc.getElementsByTagName(“动物”);
然后我可以简单地创建一个节点,将对象推入ListArray,然后在循环ListArray时对对象执行我想要的操作
for(int-temp=0;temp
简单明了!现在,在Android中,我不能简单地读取文件“res/xml/data.xml
”,因为“file();
”需要一个String
而不是integer
(id)。这就是我丢失的地方。有什么方法可以让“file();
”这样做吗打开文件,或者如果不使用SAXparser
或XPP
,这是不可能的(无论我怎么努力,这两个我都无法理解。)如果我被迫使用这些方法,有人能给我看一些类似于我的示例的简单代码吗?如果它在资源树中,它将获得分配给它的ID,因此您可以使用openRawResource函数打开一个流:
InputStream is=context.getResources().openrawsource(R.xml.data);
至于在Android中使用XML,这是非常彻底的
请参见该链接中的清单9.feed解析器的基于DOM的实现
获得输入流(如上)后,可以将其传递给DocumentBuilder的实例:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(this.getInputStream());
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("TheTagYouWant");
请记住,我个人并没有这样做——我假设IBM提供的代码可以工作。试试这个
this.getResources().getString(R.xml.test); // returns you the path , in string,invoked on activity object
我尝试了使用openRawResource的方法,得到了一个SAXParseException。因此,我使用getXml获得了一个XmlPullParser。然后我使用next()逐步完成解析事件。实际的文件是res/xml/dingors.xml
XmlResourceParser parser = context.getResources().getXml(R.xml.dinosaurs);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT :
Log.v(log_tag, "Start document");
break;
case XmlPullParser.START_TAG :
Log.v(log_tag, "Start tag " + parser.getName() );
break;
case XmlPullParser.END_TAG :
Log.v(log_tag, "End tag " + parser.getName() );
break;
case XmlPullParser.TEXT :
Log.v(log_tag, "Text " + parser.getText() );
break;
default :
Log.e(log_tag, "Unexpected eventType = " + eventType );
}
eventType = parser.next();
}
我不明白?然后我会改成字符串并将其放入“File();”?您留下的IBM资源演示了如何从联机中提取xml。我不明白为什么这么难?您能为我上面发布的内容创建一个伪代码版本吗?谢谢。这更好,我在IBM网站上看到过,但是“getInputStream();”位于BaseFeedParser类中,它“实现”了IBM站点上未列出的FeedParser类。我在代码中创建了BaseFeedParser类,但eclipse向我抛出了一个关于FeedParser的错误。该站点说:"然而,DOM通常会消耗更多的内存,因为所有内容都是先读入内存的。这在运行Android的移动设备上可能是一个问题,但在某些使用情况下,XML文档的大小永远不会很大,这是令人满意的。有人可能会暗示Android的开发人员猜测SAX解析会更常见在Android应用程序上,因此提供了额外的实用程序。“这非常糟糕。我的XML将有大约100个对象。DOM方法将50行代码添加到我的项目中,这太不切实际了。您是否使用XML来本地存储数据?在这种情况下,我建议使用SQLite。它是堆栈的本机。Re:FeedParser:它是一个接口:
public interface FeedParser