Android,XMLParser - 阅读XML

时间:2013-07-24 23:20:33

标签: android xml

我目前正在尝试从我的Android应用中的Web服务器读取XML,但我不知道如何搜索TAGS,我看到的所有示例都与我的不同:

<document>    
<producer/>
<metadata></metadata>

<recorddata count="111">
<row>
<field name="numint" value="MTAwMQ=="/>
<field name="Grupo" value="NQ=="/>
<field name="Link" value="Q29ycmllbnRlcw=="/>
<field name="Nombre" value="Q29ycmllbnRlcw=="/>
<field name="Valor" value="MzQwMC4wMA=="/>
</row>
</recorddata>
</document>

我需要阅读RECORDATA里面的ROWS,但我不知道如何解决这个问题,这是我的代码:

private void parseXML(XmlPullParser parser) throws XmlPullParserException,IOException
    {
        ArrayList<Record> Records = null;
        int eventType = parser.getEventType();
        Record currentRecord = null;
        while (eventType != XmlPullParser.END_DOCUMENT){
            String name = null;
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    Records = new ArrayList();
                    break;
                case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name == "row"){
                        currentRecord = new Record();
                    } else if (currentRecord != null){
                        if (name == "numint"){
                            currentRecord.numint = parser.getText();
                        } else if (name == "Grupo"){
                            currentRecord.group = parser.getText();
                        } else if (name == "Link"){
                            currentRecord.link= parser.getText();
                        }else if (name == "Nombre") {
                            currentRecord.name= parser.getText();
                        }else if (name == "Valor") {
                            currentRecord.value= parser.getText();
                        }
                    }
                    break;
                case XmlPullParser.END_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("row") && currentRecord != null){
                        Records.add(currentRecord);
                    }
            }
            eventType = parser.next();
        }
        printProducts(Records);
    }

但是,记录列表在流程结束时是空的,我可以告诉他们正在做某事,因为有很多记录,并且需要2分钟,直到流程结束。

我不确定我是否正确使用getName(),我应该检查字段???如果是这样,我怎么知道我在哪个领域。我应该使用nextToken()而不是???

2 个答案:

答案 0 :(得分:1)

我通过重写我的代码解决了这个问题,如下所示:

case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equals("row")){
                        currentRecord = new Record();
                    } else if (currentRecord != null) {
                        if(parser.getName().equals("field")) {
                            if(parser.getAttributeValue(null, "name").equalsIgnoreCase("numint")) {
                                currentRecord.numint = parser.getAttributeValue(null, "value");
                            }else if (parser.getAttributeValue(null, "name").equalsIgnoreCase("Grupo")) {
                                currentRecord.group = parser.getAttributeValue(null, "value");
                            }else if (parser.getAttributeValue(null, "name").equalsIgnoreCase("Link")) {
                                currentRecord.link = parser.getAttributeValue(null, "value");
                            }else if (parser.getAttributeValue(null, "name").equalsIgnoreCase("Nombre")) {
                                currentRecord.name = parser.getAttributeValue(null, "value");
                            }else if (parser.getAttributeValue(null, "name").equalsIgnoreCase("Valor")) {
                                currentRecord.value = parser.getAttributeValue(null, "value");
                            }
                        }
                    }
                    break;

通过Andreaoid采取一些答案,并稍作调整,我可以读取de xml文件而不会出现问题

答案 1 :(得分:0)

要获取属性,您可以使用以下方法:

parser.getAttributeValue(null, "value");

定义:

public abstract String getAttributeValue (String namespace, String name) 

取自帮助:

*在API级别1中添加。返回由名称空间URI和名称空间localName标识的属性值。如果禁用名称空间,则名称空间必须为null。如果当前事件类型不是START_TAG,则抛出IndexOutOfBoundsException。*

注意:替换所有字符串比较

name == "row"

使用:

name.equals("row")

希望它有所帮助。