我的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?我不习惯使用解析器......
再次感谢
答案 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();
}