gpt4 book ai didi

Java Sax解析复杂的大型XML文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:05 25 4
gpt4 key购买 nike

我正在使用 SAX 解析一些大型 XML 文件,我想问以下问题:XML 文件具有复杂的结构。类似于以下内容:

<library>
<books>
<book>
<title></title>
<img>
<name></name>
<url></url>
</img>
...
...
</book>
...
...
</books>
<categories>
<category id="abcd">
<locations>
<location>...</location>
</locations>
<url>...</url>
</category>
...
...
</categories>
<name>...</name>
<url>...</url>
</library>

事实上,这些文件每个都超过 50MB,并且许多标签在不同的上下文下重复,例如url 位于/books/book/img 下,也位于/library 下和/library/categories/category 下,依此类推。

我的 SAX 解析器使用 DefaultHandler 的子类,在其中我重写了 startElement 和 endElement 方法(以及其他方法)。但问题是,由于这些 XML 文件的业务逻辑,这些方法的代码行数巨大。我用了很多

if ("url".equalsIgnoreCase(qName)) {
// peek at stack and if book is on top
// ...
// else if category is on top
// ...
} else if (....) {
}

我想知道是否有更合适/正确/优雅的方式来执行 xml 解析。

谢谢大家

最佳答案

可以做的是实现单独 ContentHandler对于不同的上下文。例如,为 <books> 写一个,一个代表 <categories>和一个顶级的。

然后,只要books startElement方法被调用,你立即切换ContentHandler使用 XMLReader.setContentHandler() 。然后是<books>具体ContentHandler当其 endElement 时切换回顶级处理程序调用 books 的方法.

这样各ContentHandler可以专注于 XML 的特定部分,而无需了解所有其他部分。

唯一丑陋的部分是特定处理程序需要知道顶级处理程序以及何时切换回它,这可以通过提供一个简单的“处理程序堆栈”来为您处理该问题来解决。

关于Java Sax解析复杂的大型XML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7876460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com