我在 Android 应用程序中解析 XML 时遇到问题,一个问题 here暗示建议有 4 种类型的 XML 解析机制: -萨克斯 - DOM -XmlPullParser - 简单的 XML 框架
虽然 Simple Framework 很棒而且我已经在使用它,但当我发现它不能在同一个类中支持 @Text 和 @Element 时,我陷入了死胡同,这很糟糕,因为我无法更改我的 XML Scheme .
因此,我们将不胜感激任何建议。
最佳答案
SJXP是在 STAX 拉式解析规范之上作为一个非常薄的层构建的高性能库(在 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 的一个实例(可重用),然后只需将其交给 InputStreams for XML 即可根据这些规则为您解析。
SJXP 在 pull 解析器之上的解析开销接近于零(内存和 CPU 开销)——它实际上相当于 1 次哈希码计算,然后只是整数比较,看看是否有规则匹配当前XML 解析器在遍历内容时的位置。
它支持属性和字符数据——该库甚至通过使用 []-notation 以一种漂亮而优雅的方式支持 namespace ...例如:
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 膨胀(它是为长时间运行的爬虫过程中使用的提要解析器编写的).
关于java - 简单的 XML 框架解析器问题 - Android 中的 XML 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10636027/