Открыть файл XML из res / xml в Android - PullRequest
7 голосов
/ 02 декабря 2010

Я создал приложение 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();" открыть файл, или это невозможно без использования SAXparser или XPP? (оба из которых я действительно не могу понять, как бы я ни старался.)
Если я вынужден использовать эти методы, может кто-нибудь показать мне простой код, аналогичный моему примеру?

Ответы [ 3 ]

9 голосов
/ 02 декабря 2010

Если он находится в дереве ресурсов, он получит присвоенный ему идентификатор, поэтому вы можете открыть для него поток с помощью функции openRawResource:

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

Что касается работы с XML в Android, эта ссылка на 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, работает.

2 голосов
/ 03 марта 2017

Я попробовал подход с использованием 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();
}
0 голосов
/ 27 февраля 2014

Попробуйте это,

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