我在Android应用程序中解析XML时遇到问题,问题here暗示有4种类型的XML解析机制建议: - SAX - DOM - XmlPullParser - 简单的XML框架
虽然简单框架是惊人的,我已经在使用它,当我发现它不能支持同一个类中的@Text和@Element时,我遇到了死胡同,这很糟糕,因为我无法更改我的XML Scheme。
所以我们非常感谢您的想法,任何建议都会很棒。
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解析器而编写的) )。
经过长时间的研究,我发现适合我需求的最佳XML解析器是JAXB Parser。
一个示例来说明它的易用性:
@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;
所以这是我想出的最好的。
欢迎任何添加:)
如果你想将xml映射到对象http://code.google.com/p/xstream-for-android/,那么xstream非常简单
您可以使用Konsume-XML:它基于Stax / pull,但它更高级别且更易于使用。默认情况下,它不会将东西映射到对象,但可以很容易地使用它。请在Konsume-XML页面上查看更多示例。