有人能指点我解释或解释我如何只使用Android OS Lib轻松解析XML并在Android上获取w3c.Document的值吗?
我尝试使用dom4j的实现,但速度非常慢: - (
答案 0 :(得分:15)
这是一个article at Developer.com比较Android上DOM,SAX和Pull解析器的性能。它发现DOM解析器是最慢的,然后Pull解析器和SAX解析器在他们的测试中最快。
如果您要在应用程序中进行大量解析,可能需要对不同选项进行基准测试,以确定哪种方法最适合您。
我已使用XmlPullParser
通过XmlResourceParser
,发现效果很好并且易于使用。
它通过XML返回事件来告诉你它在那里发现了什么。
如果您使用它,您的代码将如下所示:
XmlResourceParser parser = context.getResources().getXml(R.xml.myfile);
try {
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
String name = null;
switch (eventType){
case XmlPullParser.START_TAG:
name = parser.getName().toLowerCase();
if (name.equals(SOME_TAG)) {
for (int i = 0;i < parser.getAttributeCount();i++) {
String attribute = parser.getAttributeName(i).toLowerCase();
if (attribute.equals("myattribute")) {
String value = parser.getAttributeValue(i);
}
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
break;
}
eventType = parser.next();
}
}
catch (XmlPullParserException e) {
throw new RuntimeException("Cannot parse XML");
}
catch (IOException e) {
throw new RuntimeException("Cannot parse XML");
}
finally {
parser.close();
}
如果要解析不是来自资源文件的XML,可以使用XmlPullParserFactory
class创建新的XmlPullParser
,然后调用setInput()
method。
答案 1 :(得分:11)
您应该明确使用提供的SAX API。 Android XML解析API堆栈在普通的Java SAX之上,所以在我看来我只会使用普通的Java SAX API,这样你就可以像普通的java桌面项目一样测试你的代码。
XML解析总是很慢,并且使用这些SAX解析器就好了(除非你从头开始编写自定义解析器)。 建议:尝试最小化字符串比较并尝试使用hashmaps而不是if(token.isEqual(CONSTANT_TOKEN))的长链;。
以下是Java XML解析的几个示例:http://java.sun.com/developer/codesamples/xml.html#sax
Android XML API是声明性的,范例有点不同,所以如果您决定使用它,请准备好阅读一些示例来了解它的方法。
最后,也许2个月前我看到了一个图表,对比了DOM vs SAX和Android XML API(我现在找不到链接)。结论是DOM是迄今为止最慢的,SAX是顶级的,但与Android的XML实现相比没有太大的优势。
答案 2 :(得分:1)
我们也可以在Android XML Parsing Things中使用 XPath ..
当您要以数组的形式解析大量数据时,它非常有用。
在解析Android的XML内容时,请查看此Link以获取XPath教程。
享受!!