简单的XML框架分析器问题 - Android中的XML解析

时间:2012-05-17 12:48:05

标签: java android xml simple-framework

我在Android应用程序中解析XML时遇到问题,问题here意味着建议有4种类型的XML解析机制: - SAX - DOM - XmlPullParser - 简单的XML框架

虽然Simple Framework令人惊讶,而且我已经在使用它了,当我发现它不能支持同一个类中的@Text和@Element时,我遇到了一个死胡同,这很糟糕,因为我无法更改我的XML Scheme

因此,我们非常感谢您的想法,任何建议都会很棒。

4 个答案:

答案 0 :(得分:4)

SJXP是一个高性能库,在STAX pull解析规范之上构建为一个非常薄的层(适用于没有依赖关系的Android)。

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

例如,您可以使用规则来定位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的一个实例(可重复使用),然后只需将其传递给XML的InputStreams,以便根据这些规则为您解析。

拉解析器的SJXP ontop的解析开销几乎为零(内存和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膨胀(它是为长期运行的蜘蛛程序中使用的feed解析器而编写的) )。

答案 1 :(得分:3)

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

  • 支持复杂类型。
  • 注释导向。
  • 适用于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;

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


欢迎任何新增内容:)

答案 2 :(得分:1)

如果你想将xml映射到对象或从对象映射,那么

xstream非常简单 http://code.google.com/p/xstream-for-android/

答案 3 :(得分:0)

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