2010-12-01 45 views
7

J'ai créé une application Java qui ouvre un fichier xml qui ressemble à ceci:fichier Open XML de res/xml dans Android

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

Et je peux l'ouvrir à l'aide:

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

Ensuite, Je peux simplement créer un noeud, pousser l'objet dans un ListArray, puis faire ce que je veux avec les objets pendant que je boucle dans le 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); 
// ... 

Clair et simple! Maintenant seulement, dans Android, je ne peux pas simplement lire le fichier "res/xml/data.xml" parce que "File();" nécessite un String pas un integer (id). C'est là que je suis perdu. Y at-il un moyen que je peux faire "File();" ouvrir le fichier, ou est-ce impossible sans utiliser SAXparser ou XPP? (Je ne peux vraiment pas les comprendre tous les deux, peu importe combien j'essaie.)
Si je suis forcé d'utiliser ces méthodes, quelqu'un peut-il me montrer un code simple analogue à mon exemple?

Répondre

8

Si c'est dans l'arborescence des ressources, il va obtenir une carte d'identité qui lui est attribué, de sorte que vous pouvez ouvrir un afflueront avec la fonction openRawResource:

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

Comme pour travailler avec XML dans Android , this link on ibm.com est incroyablement approfondie.

Voir Listing 9. DOM-based implementation of feed parser dans ce lien.

Une fois que vous avez le flux d'entrée (ci-dessus), vous pouvez le transmettre à une instance 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"); 

Gardez à l'esprit, je n'ai pas fait personnellement - je suppose que le code fourni par IBM fonctionne.

+0

Je ne comprends pas? Est-ce que je change ensuite est une chaîne et le mettre dans "File();" ? La ressource IBM que vous avez quittée montre comment extraire du XML en ligne. Je ne comprends pas pourquoi c'est si difficile? Pouvez-vous créer une version pseudo-code de ce que j'ai posté ci-dessus? Merci. – jeremy

+0

@jeremy: mise à jour de la réponse – jcollum

+0

C'est mieux et j'ai vu ça sur le site IBM, mais "getInputStream();" est dans la classe BaseFeedParser, qui "implémente" la classe FeedParser qui n'est pas répertoriée sur le site IBM. J'ai créé la classe BaseFeedParser dans mon code, mais eclipse me renvoie une erreur à propos de FeedParser. – jeremy

-1

Essayez ceci,

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

J'ai essayé l'approche par openRawResource et a obtenu un SAXParseException. Donc, à la place, j'ai utilisé getXml pour obtenir un XmlPullParser. Ensuite, j'ai utilisé next() pour parcourir les événements d'analyse. Le fichier réel est 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(); 
}