Android - 使用Simple XML从XML文件中仅获取一些元素

时间:2012-04-24 10:14:54

标签: java android xml mapping simple-framework

我的Android应用使用Simple XML读取一个巨大的XML文件。显然需要一段时间。事实上,目前我只需要检索一个元素列表。有没有办法强制Simple XML不读取所有其他元素?

我不想使用其他库。我只是想知道使用Simple XML是否可以使用这种高级内容。

感谢您的帮助。


修改

使用MH建议,解析仍然需要50秒......

所以我想使用Ilya Blokh来尝试XmlPullParser中的其他解决方案。

以下是XML文件所需的部分:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    ....
    <ANIMALS>
        <animal>
            <name>Dog</name>
            <color>white</color>
            <color>black</color>
            <color>brown</color>
        </animal>
        <animal>
            <name>Cat</name>
            <color>white</color>
            <color>black</color>
            <color>gray</color>
            <color>red</color>
        </animal>
        ...
    </ANIMALS>
    ...
</ROOT>

我想填写这个课程:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Animals {

    /**
     * Key: animal name, Value: animal colors
     */
    private Map<String, List<String>> entries;

    public Animals() {
        entries = new HashMap<String, List<String>>();
    }

    public void addAnimal(String name, List<String> colors) {
        entries.put(name, colors);
    }

    public List<String> getColors(String animalName) {
        return entries.get(animalName);
    }
}

我如何处理列表和XmlPullParser?我不习惯使用解析器......

再次感谢

4 个答案:

答案 0 :(得分:3)

您可以使用loose mapping flag来解决指定整个文档结构的严格要求。如果您直接在Persister上使用此功能,则在您的情况下可能会特别方便,因为您只提到对单个元素列表感兴趣。看看并阅读链接的示例。

不幸的是,我对Simple XML的内部不够熟悉,无法说明“不读取所有其他元素”。我想如上所述的松散映射选项只会导致您感兴趣的映射,但我怀疑您是否可以避免解析整个XML文档。

答案 1 :(得分:1)

为此使用simplexml。当xml变得复杂时,我发现与android一起使用的最好的是简单的xml。所以在你的情况下,代码将是这样的,我不能很好地格式化它,但它会有所帮助。缺点:你必须创建一堆类(取决于xml结构),但是一旦你创建它们,它之后就会非常顺利。此外,在类中添加getter以评估值。希望这有帮助

import java.util.ArrayList;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;

@Root(name = "ANIMALS", strict = false)
@Namespace(reference = "whatever", prefix = "sumthing")
public class Animal {
@ElementList(required = false, inline = true)// this will work even if some other
// element gets added to your ANIMALS element.
private ArrayList<Animal> somename; // does not matter
}

@Root(name = "animal", strict = false)
@Namespace(reference = "whatever", prefix = "sumthing")
public class Animal {
@Element(required = false)// to make it work even when this element is not part of 
    the string
private String name;
@ElementList(required = false, inline = true)
private ArrayList<Color> colors;
}

@Element(name = "color")
@Namespace(reference = "whatever", prefix = "sumthing")
public class Color {
@Element(required = false)   
private String clr;
public String getColor(){
return clr; 
}
}

答案 2 :(得分:0)

首先,您需要考虑您的应用程序要求,以及为什么您需要首先使用SimpleXML。为什么不使用基于Java的XML解析。以下是您可以使用的选项列表:Best XML parser for Java

答案 3 :(得分:0)

当看到XmlPullParser有多容易时,也许你会改变主意。

您可以在此处阅读:http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

XmlPullParser用法示例:

XmlPullParser parser = getResources().getXml(R.xml.yourxml);
try {
            while (parser.getEventType() != XmlPullParser.END_DOCUMENT){
                if(parser.getEventType() == XmlPullParser.START_TAG && 
                        parser.getName().equalsIgnoreCase("object")){

                            name = parser.getAttributeValue(null, "name");
                            site = parser.getAttributeValue(null, "site");
                            phone = parser.getAttributeValue(null, "phone");
                            adds = parser.getAttributeValue(null, "address");
                }
                parser.next();
            }
        }  catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }