2

我在 Android 应用程序中解析 XML 时遇到问题,这里的一个问题暗示建议有 4 种类型的 XML 解析机制:- SAX - DOM - XmlPullParser - 简单 XML 框架

虽然 Simple Framework 很棒,而且我已经在使用它,但当我发现它不能在同一个类中支持 @Text 和 @Element 时,我走到了死胡同,这很糟糕,因为我无法更改我的 XML 方案。

所以想法受到赞赏,任何建议都会很棒。

4

4 回答 4

4

SJXP是一个高性能库,在 STAX 拉解析规范之上构建为一个非常薄的层(在 Android 上工作,没有依赖项)。

它不是像 Simple 或 JAXB 那样的 ORM 库,而是专注于 pull 解析规范为我们提供的最大解析性能,但使用 XPath 提供易于定义的解析规则,而不是管理 pull 解析器的陈述自己。

例如,您可以使用规则定位 XML 中的某些元素,如下所示(这是我用它构建的 RSS 解析器示例):

IRule linkRule = new DefaultRule(Type.CHARACTER, "/rss/channel/item/link") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        // 'text' is the link; store it, print it, whatever you need...
    }
}

您定义任意数量的规则并将它们提供给 XMLParser 的一个实例(可重用),然后只需将其交给 InputStreams for XML 以根据这些规则为您解析。

在 pull 解析器之上的 SJXP 解析开销接近于零(内存和 CPU 开销)——它实际上相当于 1 次哈希码计算,然后只是整数比较,以查看是否存在与当前位置匹配的规则XML 解析器同时运行内容。

它支持属性和字符数据——这个库甚至有一个很好的优雅的方式来支持命名空间,通过使用 []-notation... 例如:

IRule channelSubjectRule = new DefaultRule(Type.CHARACTER, "/rss/channel/[http://purl.org/dc/elements/1.1/]subject") {
    @Override
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
        // Got the Channel's dc:subject value! I win!
    }
}

图书馆并不是要成为另一个对你隐藏一切的神奇抽象;它意味着比这低一点,但仍然高于直接解析 STAX,而不会在嵌入式或高性能系统的解析过程中引入内存或 CPU 膨胀(它是为用于长时间运行的爬虫进程的提要解析器编写的)。

于 2012-05-20T14:52:03.217 回答
3

经过长时间的研究,我发现最适合我需要的 XML 解析器是 JAXB 解析器。

  • 支持复杂类型。
  • 面向注释。
  • 适用于 Android。
  • 很容易理解。
  • Java 1.6+ 中已经存在生成 JAXB 注释类的工具

一个例子来展示它是多么容易使用:

@XmlRootElement(name = "a")
 public class A {

@XmlElementRefs({
    @XmlElementRef(name = "lang", namespace = "http://www.w3.org/namespace/", type = Lang.class, required = false),
    @XmlElementRef(name = "subst", namespace = "http://www.w3.org/namespace/", type = Subst.class, required = false),
    @XmlElementRef(name = "include", namespace = "http://www.w3.org/namespace/", type = Include.class, required = false),
    @XmlElementRef(name = "br", namespace = "http://www.w3.org/namespace/", type = Br.class, required = false),
    @XmlElementRef(name = "kw", namespace = "http://www.w3.org/namespace/", type = Kw.class, required = false),
    @XmlElementRef(name = "help", namespace = "http://www.w3.org/namespace/", type = Help.class, required = false)
})
@XmlMixed
protected List<Object> content;
@XmlAttribute(name = "cost")
protected String cost;
@XmlAttribute(name = "href", required = true)
protected String href;
@XmlAttribute(name = "key")
protected String key;

所以这是我想出的最好的。


欢迎任何补充:)

于 2012-09-11T07:21:56.340 回答
1

如果您想将您的 xml 映射到/从对象http://code.google.com/p/xstream-for-android/,xstream非常容易

于 2012-05-17T12:51:03.520 回答
0

您可以使用Konsume-XML:它基于 Stax/pull,但它更高级别且更易于使用。默认情况下,它不会将内容映射到对象,但可以很容易地使用它。请在 Konsume-XML 页面查看更多示例。

于 2019-04-12T17:24:54.230 回答