在 Android 上解析 XML (org.w3c.Document) 的方法

Posted

技术标签:

【中文标题】在 Android 上解析 XML (org.w3c.Document) 的方法【英文标题】:Way to parse XML (org.w3c.Document) on Android 【发布时间】:2010-12-27 23:56:18 【问题描述】:

谁能指出我的解释或向我解释我如何在仅使用 android OS Libs 的 Android 上轻松解析 XML 并获取 w3c.Document 的值?

我尝试使用 dom4j 的实现,但速度很慢 :-(

【问题讨论】:

【参考方案1】:

这是一个article at Developer.com 比较 Android 上 DOM、SAX 和 Pull 解析器的性能。它发现 DOM 解析器是迄今为止最慢的,然后是 Pull 解析器和 SAX 解析器在他们的测试中最快。

如果您要在应用程序中进行大量解析,则可能值得对不同的选项进行基准测试,看看哪个最适合您。

我通过XmlResourceParser 使用了XmlPullParser,发现它运行良好且易于使用。

它通过 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。

【讨论】:

有没有办法用 XmlResourceParser 解析远程 XML? XmlResourceParser 是 XmlPullParser 的子类。我应该一直在谈论那个。我已添加到答案中,以展示如何使用 XmlPullParser 解析远程 XML。 是的,直接使用 PullParser:developer.android.com/reference/org/xmlpull/v1/…【参考方案2】:

您应该明确使用提供的 SAX API。 Android XML 解析 API 堆栈在普通 java SAX 之上,所以我认为我只会使用普通 Java SAX API,这样你就可以像普通 java 桌面项目一样测试你的代码。

XML 解析总是很慢,并且使用这些 SAX 解析器就可以了(除非您从头开始编写自定义解析器)。 忠告:尽量减少字符串比较并尝试使用哈希图而不是 if (token.isEqual(CONSTANT_TOKEN)); 的长链。

以下是 Java XML 解析的几个示例:http://java.sun.com/developer/codesamples/xml.html#sax

Android XML API 是声明式的,范式有点不同,所以如果您决定采用它,请准备阅读一些示例以了解其方式。

最后,也许是 2 个月前,我看到了一个图表,对 DOM、SAX 和 Android XML API 进行了基准测试(我现在找不到链接)。结论是 DOM 是迄今为止最慢的,而 SAX 是最高的,但与 Android 的 XML 实现相比并没有很大的差距。

【讨论】:

嗨 ruibm 它对我也很有用.. 你能展示如何使用哈希图而不是长链 if 条件...【参考方案3】:

我们也可以在 Android XML Parsing Things 中使用 XPath ..

当您要以数组的形式解析大量数据时,它很有用。

查看此Link 了解从 Android 解析 XML 内容的 XPath 教程。

尽情享受吧!

【讨论】:

以上是关于在 Android 上解析 XML (org.w3c.Document) 的方法的主要内容,如果未能解决你的问题,请参考以下文章

org.w3c.dom(java dom)解析XML文档

java解析xml的具体流程

将解析的 xml 数据存储到 sqlite ?安卓

DOM的概念和简单应用:使用DOM解析XML数据

XML文件解析!!!

使用JAXP进行XM解析(基于DOM)