我正在试图弄清楚如何解析一些XML (对于Android应用程序),在Java中做这件事有多么困难似乎是相当可笑的。这似乎需要创建一个具有各种回调(startElement、endElement等)的XML处理程序,然后您必须注意将所有这些数据转换为对象。就像this tutorial一样。
我真正需要的就是将一个XML文档转换成一个多维数组,如果有某种Hpricot处理器就更好了。有没有办法做到这一点,或者我真的必须在上面的示例中编写所有额外的代码?
发布于 2009-11-12 09:28:36
Java中有两种不同类型的XML处理器(实际上有3种,但有一种很奇怪)。您拥有的是一个SAX解析器,而您想要的是一个DOM解析器。有关如何使用DOM解析器的信息,请参阅http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/。DOM将创建一个树,您可以很容易地导航。SAX最适合大型文档,但是DOM要简单得多,如果速度慢,内存消耗大得多。
发布于 2010-03-02 07:17:24
试试http://simple.sourceforge.net,它是一个从XML到Java的序列化和绑定框架,它与Android完全兼容,非常轻量级,270K并且没有依赖。
发布于 2011-02-24 04:05:11
凯尔
(请原谅这篇文章的自我推销性质...我已经在这个库上工作了几个月了,它都是开源的/Apache2,所以不是自私自利,只是想提供帮助)。
我刚刚发布了一个名为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 feed的元素,这样您就可以知道它使用的是哪种语言(参见:http://web.resource.org/rss/1.0/modules/dc/)。您只需对带有'dc‘前缀的'language’元素使用唯一的名称空间URI,规则路径将如下所示:
/rss/channel/http://purl.org/dc/elements/1.1/language
名称空间限定的属性也是如此。
如此简单,您添加到解析过程的唯一开销是在XML文档的每个位置进行O(1)散列查找,以及用于解析器的内部位置状态的几百个字节(可能是1k )。
这个库可以在安卓上工作,不需要额外的依赖(因为平台已经提供了一个Java ),并且可以通过添加XPP3依赖在任何其他org.xmlpull运行时中工作。
这个库是几个月来为每种语言的每种提要XML编写自定义拉出解析器的结果,并且(随着时间的推移)认识到大约90%的解析可以提炼成这个真正的基本范式。
我希望你会发现它很方便。
https://stackoverflow.com/questions/1719261
复制相似问题