0

背景:

最近,我的任务是从 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,我有三个仅针对单个元素触发的离散方法调用,因此此状态必须是持久且可存储的。这样做的最明显和最简单的方法是使用大量布尔变量,但这不是我之前列出的四个租户。我还考虑过使用位掩码来维护大量标志,但这很难自我记录或非常可扩展。最后,我考虑了一个有限状态自动机(或其他类似的衍生产品,例如下推自动机),但对于一次性机器来说,这些似乎有点矫枉过正。

也许我过度思考一次性代码的问题,我一直在寻求扩展我的技能组合,因为我不得不编写不是一次性的代码。提前感谢您的时间和帮助。

参考:

http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

大型嵌套 switch 语句的设计模式 (与 XML 没有直接关系,但给出了一些关于使用大量离散条件进行设计的想法)

4

1 回答 1

0

我会保留一堆结构{element, count},并且对于每个结构,startElement()我都会增加父结构countpush一个新元素,然后在.endElement()pop

这样,您将能够在给定文档中保留唯一位置,并构造 XPath,如/html/table/tr[23]/td[1]. 或者,更快但可能会消耗更多内存,您可以复制当前堆栈。

于 2013-06-22T19:51:48.323 回答