4

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

我不想使用另一个库。我只是想知道这种高级的东西是否可以使用简单的 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

4 回答 4

4

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

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

于 2012-04-24T10:39:36.170 回答
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; 
}
}
于 2012-04-24T17:42:31.657 回答
0

首先,您需要通过考虑您的应用程序需求来证明为什么首先需要使用 SimpleXML。为什么不使用基于 Java 的 XML 解析。以下是您可以使用的选项列表:Java 的最佳 XML 解析器

于 2012-04-24T10:31:58.753 回答
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();
        }
于 2012-04-24T10:35:14.643 回答