我在 Android 应用程序中解析 XML 时遇到问题,这里的一个问题暗示建议有 4 种类型的 XML 解析机制:- SAX - DOM - XmlPullParser - 简单 XML 框架
虽然 Simple Framework 很棒,而且我已经在使用它,但当我发现它不能在同一个类中支持 @Text 和 @Element 时,我走到了死胡同,这很糟糕,因为我无法更改我的 XML 方案。
所以想法受到赞赏,任何建议都会很棒。
我在 Android 应用程序中解析 XML 时遇到问题,这里的一个问题暗示建议有 4 种类型的 XML 解析机制:- SAX - DOM - XmlPullParser - 简单 XML 框架
虽然 Simple Framework 很棒,而且我已经在使用它,但当我发现它不能在同一个类中支持 @Text 和 @Element 时,我走到了死胡同,这很糟糕,因为我无法更改我的 XML 方案。
所以想法受到赞赏,任何建议都会很棒。
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 膨胀(它是为用于长时间运行的爬虫进程的提要解析器编写的)。
经过长时间的研究,我发现最适合我需要的 XML 解析器是 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;
所以这是我想出的最好的。
欢迎任何补充:)
您可以使用Konsume-XML:它基于 Stax/pull,但它更高级别且更易于使用。默认情况下,它不会将内容映射到对象,但可以很容易地使用它。请在 Konsume-XML 页面查看更多示例。