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

标签 java android xml simple-framework

我在 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/

相关文章:

android - Response.body() 在 Android 中使用 Retrofit 2.0.2 时返回具有空属性的对象

php - 由于冒号而未获取 xml 节点

python - 跨多个用户的 RESTful API

python - 忠实地保留已解析 XML 中的注释

android - 应用程序正在等待调试器附加

java - 设置 Jmeter 和 Junit 的测试数据

java - JPA:从另一个表加载值列表

java - 如何解决 joda-time 和 org.joda 之间的包冲突

java - Android Widget - 两行?

java - 创建自定义标签 在输入字段为空时使用