我在Android应用程序中解析XML时遇到问题,问题here意味着建议有4种类型的XML解析机制: - SAX - DOM - XmlPullParser - 简单的XML框架
虽然Simple Framework令人惊讶,而且我已经在使用它了,当我发现它不能支持同一个类中的@Text和@Element时,我遇到了一个死胡同,这很糟糕,因为我无法更改我的XML Scheme
因此,我们非常感谢您的想法,任何建议都会很棒。
答案 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。
示例显示使用方式:
@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)
xstream非常简单 http://code.google.com/p/xstream-for-android/
答案 3 :(得分:0)
您可以使用Konsume-XML:它基于Stax / pull,但级别更高,更易于使用。默认情况下,它不会将内容映射到对象,但是可以很容易地使用它。请在Konsume-XML页面上查看更多示例。