背景
最近,我的任务是从HTML表单中解析大量数据并将其构建到可用的数据库表中。有问题的HTML页面是很久以前生成的,原始源数据已经丢失了很久。因此,我决定在Java中使用快速解析器来获取这些数据并对其进行适当格式化。 SAX将被利用,因为我不需要以任何方式修改层次结构,只需要一次通过即可。下面包含一个非常小的HTML示例:
<html>
<table>
<tr>
<table>
<tr>
<td><div>District 1</div><td></tr>
<tr>
<td><div>Valid Code 1</div></td>
<td><div>Valid Code 2</div></td>
<td><div>Valid Code 3</div></td>
</tr>
</table>
</tr>
ETC...
显然,HTML不仅仅是上面概述的内容,而是应该对结构有所了解。
问题:
我正在寻找一种智能,可扩展,自我记录和(如果可能的)快速/精益方法,使用SAX解析器跟踪XML层次结构中的当前位置。因为,使用SAX,我有三个仅针对单个元素触发的离散方法调用,此状态必须是持久且可存储的。这样做的明显和最简单的方法将是一大堆布尔变量,但这不是我已经列出的前四个租户。我还考虑过bitmasking来维护大量的标志,但这几乎不是自我记录或非常可扩展的。最后,我考虑过有限状态自动机(或其他类似的衍生物,例如下推自动机),但这些似乎有点过度的一次性。
也许我过度思考一次性代码的问题,我总是希望扩展我的技能集,因为我必须编写不是一次性的代码。提前感谢您的时间和帮助。
参考文献:
http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/
Design pattern for a large nested switch statements (与XML没有直接关系,但提供了一些关于使用大量离散条件进行设计的想法)
答案 0 :(得分:0)
我会保留一堆结构{element, count}
,并且对于每个startElement()
,我会将父结构的count
和push
增加为一个新元素,并在{ {1}},我endElement()
。
这样,您就可以在给定文档中保留唯一的位置,并构建像pop
这样的XPath。或者,更快但可能更多的内存消耗,你可以复制当前的堆栈。