快速、轻量级的XML解析器

12

我将会得到一个特定格式的XML文档。这个文档的类型是固定的,所以非常严格。

我需要解析它,以便将其转换为JSON(稍加修改以便他人可以在DOJO中使用)。

我的问题是,我应该使用非常快速轻量级(无需SAX等)的XML解析器(有任何想法吗?),还是编写自己的解析器,基本上将其转换为StringBuffer并遍历数组?基本上,在底层,我认为所有HTML解析器都会通过字符串(或内存缓冲区)旋转并解析,同时生成输出。

谢谢

编辑

XML将在3/4行到最多50行之间。


尝试使用vtd-xml,你不会后悔的。 - vtd-xml-author
可能是[Java的小型、极简和快速的XML库?]的重复问题(https://dev59.com/KmDVa4cB1Zd3GeqPg9Kr) - Danubian Sailor
8个回答

11
不,你不应该尝试为此编写自己的XML解析器。 SAX本身非常轻量级和快速,所以我不确定为什么认为它太重了。而且使用字符串缓冲区实际上比使用SAX要不可扩展得多,因为SAX不需要将整个XML文件加载到内存中即可使用。我曾经使用SAX来解析数十亿字节的XML文件,在32位机器上使用字符串缓冲区是行不通的。
如果您有小文件并且不需要担心性能问题,请考虑使用DOM。Java的实现可能有点麻烦(您可以使用DocumentBuilderFactory创建一个DocumentBuilder来创建文档)。
从文件创建文档的代码如下:
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream("file.xml"));

请注意,如果您需要解析多个文件,则保留对文档构建器的引用将加快速度。

然后您可以使用来自 org.w3c.dom.Document 的函数读取或操作内容。例如,getElementsByTagName() 返回具有特定标签名称的所有元素。


1
我怀疑Joe所谓的“轻巧”是指“易于使用”;SAX的回调导向API并不是最用户友好的。 - Michael Borgwardt
1
如果可以的话,我会更加地混乱。SAX 是在 Java 中读取 XML 最有效的方式。你很难编写一个更好的正确的 XML 解析器。我认为应该可以编写回调来直接生成 JSON。如果翻译很少,那么它可能非常微小。 - PSpeed
@Michael Borgwardt:我认为使用DOM比编写自己的解析器更容易 :) - Chad Okere
但是DOM绝对不是轻量级的。对于这种从一种格式到另一种格式的转换,SAX是理想的选择。如果做得好,您可以处理永远无法适应内存的文件。(在这种情况下您不需要它,但这不是重点。:)) - PSpeed
@PSpeed:在我看来,SAX并不是最理想的选择,因为SAX的事件驱动方法比kXML解析器或类似解析器的拉取解析方法更难理解和使用。 - WildWezyr
显示剩余3条评论

7

谢谢,我会看一下简单的。 - joe90

3
也许您应该看看kXML 2,这是一个专门为受限环境设计的小型XML pull解析器,可用于访问、解析和显示Java 2微型版设备的XML文件。它也可以很好地与Java SE/EE一起使用 ;-)。由于它是为微型版设计的,因此非常轻量级(占用空间小),并且在我看来非常易于使用(比SAX/DOM等东西更容易)。
根据我自己使用kXML 2的经验:我用它来解析大于1 GB的XML文件 - Wikipedia转储文件,对性能/内存消耗等非常满意。
最后;-) - 链接:http://kxml.sourceforge.net/kxml2/

谢谢,我们会看一下 :) 因为在某个时候我们也需要一个移动版本。 - joe90

1

你真的需要解析/操作XML文档中的任何数据吗?如果不需要,你可以使用XSLT。非常简单,非常快速。


XSLT旨在转换XML,因此将其用于转换为JSON是一个好主意。 - james.garriss

1
你可以使用Dom4j/xstream将XML读入等效的Java模型,然后使用JSONLIB将其转换为JSON。

Dom4j具有类似SAX的API,但更易于使用。 - Ondra Žižka

0

使用真正的XML解析器。如果不这样做,当某些东西发生变化时,你很可能会遇到问题。文档可能非常严格,但两年后,某些东西可能会被重构并改变结构,以便使用XML解析器解析到相同的数据结构,并打破自制字符串解析器。


我理解你的观点,但是在不同的领域(即链中的下一步)中,他们已经更改了纯json位以满足他们的要求。 - joe90
因此,不太符合JSON标准的解析器已经设置好了以进行崩溃,但是没有必要通过使用不太符合XML标准的解析器来引入相同的问题并使问题更加复杂化。 - Quentin

0

在后端进行解析并公开JSON可能是正确的方法,这样您就可以拥有通用的JSON数据,可以轻松地与其他来源集成。但是,如果您有一个简单的消息,并且这是您认为您将使用JSON的唯一位置,则可以尝试在客户端进行解析。Dojo具有实验性客户端XML解析器


-2

你必须使用XML吗?

我发现自己的自定义文本格式比任何现成的XML或JSON包都要快得多 - 它们很快,但通过控制自己的格式并仅进行字符串解析,我能够将时间减半,比最快的XML实现还要快。

显然,只有在完全掌控格式的情况下才适用,可能不适合您的情况,但对于其他处于这种情况的人来说:不要认为XML是您拥有的绝对最快选项。它不是。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接