使用Java SAX进行智能XML遍历

时间:2012-06-21 17:25:57

标签: java xml design-patterns sax

背景

最近,我的任务是从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没有直接关系,但提供了一些关于使用大量离散条件进行设计的想法)

1 个答案:

答案 0 :(得分:0)

我会保留一堆结构{element, count},并且对于每个startElement(),我会将父结构的countpush增加为一个新元素,并在{ {1}},我endElement()

这样,您就可以在给定文档中保留唯一的位置,并构建像pop这样的XPath。或者,更快但可能更多的内存消耗,你可以复制当前的堆栈。