2010-12-01 17 views
7

he creado una aplicación Java que se abre un archivo XML que se ve algo como esto:archivo XML Abierto de res/xml en Android

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

Y puedo abrirlo usando:

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

Entonces Simplemente puedo crear un nodo, insertar el objeto en un ListArray y luego hacer lo que quiero con los objetos mientras recorro 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); 
// ... 

Así de simple! Ahora solo, en Android no puedo simplemente leer el archivo "res/xml/data.xml" porque "File();" requiere un String no un integer (id). Aquí es donde estoy perdido. ¿Hay alguna forma en que pueda hacer que "File();" abra el archivo, o es imposible sin usar SAXparser o XPP? (ambos de los cuales realmente no puedo entender, no importa cuánto lo intente).
Si me veo forzado a usar esos métodos, ¿alguien me puede mostrar un código simple análogo a mi ejemplo?

Respuesta

8

Si está en el árbol de recursos, que va a obtener un ID asignado a la misma, por lo que puede abrir una secuencia a ella con la función openRawResource:

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

En cuanto a trabajar con XML en Android , this link on ibm.com es increíblemente completo.

Ver Listing 9. DOM-based implementation of feed parser en ese enlace.

Una vez que tenga el flujo de entrada (arriba) se puede pasar a una instancia de DocumentBuilder:

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

tener en cuenta, no he hecho esto personalmente - Asumo el código proporcionado por IBM funciona.

+0

Yo no lo entiendo? ¿Cambio luego a una cadena y pongo eso en "Archivo()"? ? El recurso de IBM que dejó muestra cómo sacar xml de en línea sin problemas. No entiendo por qué esto es tan difícil? ¿Puedes crear una versión de pseudo código de lo que publiqué arriba? Gracias. – jeremy

+0

@jeremy: respuesta actualizada – jcollum

+0

Eso es mejor y lo vi en el sitio de IBM, pero "getInputStream();" está en la clase BaseFeedParser, que "implementa" la clase FeedParser que no figura en el sitio de IBM. Creé la clase BaseFeedParser en mi código, pero eclipse me está arrojando un error sobre FeedParser. – jeremy

-1

Prueba de esto,

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

He probado el método que utiliza openRawResource y tiene un SAXParseException. Entonces, en cambio, utilicé getXml para obtener un XmlPullParser. Luego usé next() para recorrer los eventos de análisis. El archivo real es 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(); 
} 
Cuestiones relacionadas