凯尔,
(请原谅这篇文章的自我推销性质......我已经在这个库上工作了几个月,它都是开源/Apache 2,所以不是自私自利,只是想提供帮助)。
我刚刚发布了一个库,我称之为 SJXP 或“Simple Java XML Parser”
http://www.thebuzzmedia.com/software/simple-java-xml-parser-sjxp/
它是一个非常小/紧凑(4 类)的抽象层,位于任何符合规范的 XML Pull Parser 之上。
在 Android 和非 Android Java 平台上,拉式解析可能是性能最高(速度和内存开销低)的解析方法之一。不幸的是,直接针对拉式解析器进行编码最终看起来很像任何其他 XML 解析代码(例如 SAX)——您有异常处理程序、维护解析器状态、错误检查、事件处理、值解析等。
SJXP 的作用是允许您在文档中定义您想要从中获取值的元素或属性的类似 XPath 的“路径”,例如:
/rss/频道/标题
当该规则匹配时,它将调用您的回调,并带有该值。该 API 非常直接,并且对命名空间限定的元素具有直观的支持,如果这是您尝试解析的内容。
标准解析器的代码如下所示(解析 RSS2 提要标题的示例):
IRule titleRule = new DefaultRule(Type.CHARACTER, "/rss/channel/title") {
@Override
public void handleParsedCharacters(XMLParser parser, String text) {
// Store the title in a DB or something fancy
}}
然后您只需创建一个 XMLParser 实例并为其提供您希望它关心的所有规则:
XMLParser parser = new XMLParser(titleRule);
parser.parse(xmlStream);
就是这样,每次规则匹配时解析器都会调用处理程序方法。如果需要,您可以随时调用 parser.stop() 停止解析。
此外(这是这个库的真正优势)匹配命名空间限定的元素和属性非常容易,您只需将它们的命名空间 URI 添加到路径中元素名称前缀的括号内。
举个例子,假设你想要一个 RSS 提要的元素,这样你就可以知道它是什么语言(参考:http://web.resource.org/rss/1.0/modules/dc/)。您只需为带有“dc”前缀的“语言”元素使用唯一的命名空间 URI,规则路径最终看起来像这样:
/rss/channel/[http://purl.org/dc/elements/1.1/]语言
命名空间限定的属性也是如此。
如此简单,您添加到解析过程中的唯一开销是在 XML 文档的每个位置进行 O(1) 哈希查找,以及解析器内部位置状态的几百字节,可能是 1k .
该库可以在没有额外依赖项的 Android 上运行(因为该平台已经提供了 org.xmlpull impl),并且通过添加 XPP3 依赖项可以在任何其他 Java 运行时中运行。
这个库是几个月来为每种语言的每种提要 XML 编写自定义拉式解析器的结果,并且意识到(随着时间的推移)大约 90% 的解析可以提炼成这个真正基本的范例。
我希望你觉得它很方便。