首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有更简单的方法来解析Java中的XML?

有没有更简单的方法来解析Java中的XML?
EN

Stack Overflow用户
提问于 2009-11-12 09:20:51
回答 13查看 36K关注 0票数 34

我正在试图弄清楚如何解析一些XML (对于Android应用程序),在Java中做这件事有多么困难似乎是相当可笑的。这似乎需要创建一个具有各种回调(startElement、endElement等)的XML处理程序,然后您必须注意将所有这些数据转换为对象。就像this tutorial一样。

我真正需要的就是将一个XML文档转换成一个多维数组,如果有某种Hpricot处理器就更好了。有没有办法做到这一点,或者我真的必须在上面的示例中编写所有额外的代码?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 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要简单得多,如果速度慢,内存消耗大得多。

票数 26
EN

Stack Overflow用户

发布于 2010-03-02 07:17:24

试试http://simple.sourceforge.net,它是一个从XML到Java的序列化和绑定框架,它与Android完全兼容,非常轻量级,270K并且没有依赖。

票数 15
EN

Stack Overflow用户

发布于 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提要标题的示例):

代码语言:javascript
复制
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实例,并为其提供您希望它关心的所有规则:

代码语言:javascript
复制
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%的解析可以提炼成这个真正的基本范式。

我希望你会发现它很方便。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1719261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档