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

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

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

【问题讨论】:

    标签: xml android


    【解决方案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 教程。

    尽情享受吧!

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2015-12-29
      • 2020-08-27
      相关资源
      最近更新 更多