在Android中从res / xml打开XML文件

时间:2010-12-01 21:26:19

标签: android xml file local saxparser

我创建了一个Java应用程序,它打开一个如下所示的xml文件:

<AnimalTree>
  <animal>
    <mammal>canine</mammal>
    <color>blue</color>
  </animal>
  <!-- ... -->
</AnimalTree>

我可以使用以下方式打开它:

File fXmlFile = getResources.getXml("res/xml/data.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList animalNodes = doc.getElementsByTagName("animal");

然后我可以简单地创建一个节点,将对象推入ListArray,然后在循环ListArray时对对象执行我想要的操作。

for (int temp = 0; temp < animalNodes.getLength(); temp++) {
Node nNode = animalNodes.item(temp);     
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
question thisAnimal = new animal();
thisAnimal.mammal = getTagValue("mammal",eElement);
// ...

简单明了!现在,在Android中我不能简单地读取文件“res/xml/data.xml”,因为“File();”需要String而不是integer(id)。这是我迷失的地方。是否有某种方法可以让“File();”打开文件,或者如果不使用SAXparserXPP这是不可能的? (无论我怎么努力,我都无法理解这两者。)
如果我被迫使用这些方法,有人可以给我一些类似于我的例子的简单代码吗?

3 个答案:

答案 0 :(得分:9)

如果它在资源树中,它将获得一个ID,因此您可以使用openRawResource函数打开它的流:

InputStream is = context.getResources().openRawResource(R.xml.data);

至于在Android中使用XML,this link on ibm.com非常彻底。

请参阅该链接中的Listing 9. DOM-based implementation of feed parser

获得输入流(上图)后,您可以将其传递给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提供的代码有效。

答案 1 :(得分:2)

我尝试使用openRawResource的方法并获得了SAXParseException。所以,相反,我使用getXml来获取XmlPullParser。然后我使用next()来逐步解析解析事件。实际文件是res / xml / dinosaurs.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();
}

答案 2 :(得分:-1)

试试这个,

this.getResources().getString(R.xml.test); // returns you the path , in string,invoked on activity object