在android上读取Xml文件

时间:2013-11-23 08:54:30

标签: java android xmlpullparser

我正在尝试读取包含120个这样的项目的Xml文件。

<?xml version="1.0" encoding="utf-8"?>
 <books>
        <Book>
            <bookName >Libro 1</bookName>
            <bookSection>Unidad 1</bookSection>
            <memorization>[A long string of information]…</memorization>
        </Book>
        <Book>.....</Book>
 </books>

在我的Android应用中,我想将所有这些信息放在ArrayList<book>

所以在虚空OnCreate中我这样做:

Resources res = getResources();
XmlResourceParser x = res.getXml(R.xml.textos);
        try {
            insertXML(x);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

和InsertXML看起来像这样。

private void insertXML(XmlPullParser x) throws XmlPullParserException, IOException {        
        try {

            int eventType = x.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {

                Textos seleccion = new Textos();

                if ( eventType == XmlPullParser.START_TAG ) {
                    if (x.getAttributeValue(null, "Book") != null) {
                        seleccion.setBook(x.getAttributeValue(null, "bookName"));
                        seleccion.setSection(x.getAttributeValue(null, "bookSection"));
                        seleccion.setMemorization(x.getAttributeValue(null, "memorization"));
                    }

                }

                if ( eventType == XmlPullParser.END_TAG ) {
                    if (x.getName().equals("Book")) {
                        texto.add(seleccion);
                    }
                }

                eventType = x.next();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这是一个错误,因为永远不会进入if (x.getAttributeValue(null, "Book") != null) {

当我使用调试模式时告诉我x.depth() = 0

那么,我做错了什么?

1 个答案:

答案 0 :(得分:1)

Book不是属性 - 它是一个元素(标记)。你应该使用:

if (x.getName().equals("Book"))

检查您是否在Book元素上。但是,这实际上对您没有多大帮助,因为您实际上是在bookNamebookSectionmemorization标记之后。我怀疑你真的想要(在检查START_TAG事件中):

if (x.getName().equals("bookName")) {
    seleccion.setBook(x.nextText());
} else if (x.getName().equals("bookSection")) {
    seleccion.setSection(x.nextText());
} else if (x.getName().equals("memorization")) {
    seleccion.setMemorization(x.nextText());
}

了解元素和属性之间的区别非常重要。例如,在:

<x y="z">Foo</x>

元素<x>y是属性值"z"Foox内的文字1}}元素。