Open XML file from res/xml in Android

心已入冬 提交于 2019-12-17 18:58:48

问题


I created a Java application which opens an xml file that looks something like this:

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

And I can open it using:

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");

Then I can simply create a node, push the object into a ListArray, then do what I want with the objects as I loop through the 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);
// ...

Plain and simple! Now only, in Android I cannot simply read the file "res/xml/data.xml" because "File();" requires a String not an integer (id). This is where I am lost. Is there some way I can make "File();" open the file, or is this impossible without using SAXparser or XPP? (both of which I really cannot understand, no matter how hard I try.)
If I am forced to use those methods, can someone show me some simple code analogous to my example?


回答1:


If it's in the resource tree, it'll get an ID assigned to it, so you can open a stream to it with the openRawResource function:

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

As for working with XML in Android, this link on ibm.com is incredibly thorough.

See Listing 9. DOM-based implementation of feed parser in that link.

Once you have the input stream (above) you can pass it to an instance of DocumentBuilder:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(this.getInputStream());
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("TheTagYouWant");

Keep in mind, I haven't done this personally -- I'm assuming the code provided by IBM works.




回答2:


I tried the approach using openRawResource and got a SAXParseException. So, instead, I used getXml to get a XmlPullParser. Then I used next() to step through the parsing events. The actual file is 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();
}



回答3:


Try this,

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


来源:https://stackoverflow.com/questions/4329308/open-xml-file-from-res-xml-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!