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

问题描述 投票:2回答:4

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

虽然简单框架是惊人的,我已经在使用它,当我发现它不能支持同一个类中的@Text和@Element时,我遇到了死胡同,这很糟糕,因为我无法更改我的XML Scheme。

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

java android xml simple-framework
4个回答
4
投票

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

它不是像Simple或JAXB这样的ORM库,而是专注于拉解析规范给我们的最大解析性能,但是使用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的实例(可重用),然后只需将其传递给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解析器而编写的) )。


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;

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


欢迎任何添加:)


1
投票

如果你想将xml映射到对象http://code.google.com/p/xstream-for-android/,那么xstream非常简单


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.