我正在解析Java应用程序中的自定义XML配置文件。我正在尝试使用 SAX 解析器,主要是因为我需要使用行号报告配置中的错误。
网上有很多实现处理程序类的代码示例,对于正常处理来说,事情似乎相当简单 - 例如,http://tutorials.jenkov.com/java-xml/sax-example.html
但就我而言,有时我需要跳过元素下的整个树:
<sampledocument>
<sampletag>
<process/>
<these/>
<tags/>
</sampletag>
<sampletag skip="yes">
<do_not>
<process/>
<these/>
<tags/>
</sampletag>
<sampledocument>
后来补充: 此外,我只知道是否在运行时跳过。在一个有点人为的例子中,我需要打开一个文件来处理 <sampletag>
下的标签,如果找不到该文件,则不要处理它们:
<sampledocument>
<sampletag file="file1">
<process/>
<these/>
<tags/>
<if_file1_exists/>
</sampletag>
<sampletag file="file2">
<process/>
<these/>
<tags/>
<if_file2_exists/>
</sampletag>
<sampledocument>
当然,我可以在处理程序代码中跟踪跳过,但这有点尴尬。我可以以某种方式告诉 startElement(( 方法中的 SAX 跳过这个元素的内容吗?
编写一个筛选器类,以位于 SAX 分析器和现有内容处理程序之间的管道上。您可以通过扩展XMLFilterImpl
来执行此操作。此筛选器应具有整数变量 skipDepth,最初为零。
在startElement中,如果您识别出要深度跳过的元素,或者如果skipDepth>0,则递增skipDepth。
在 endElement 中,如果 skipDepth> 0,则递减 skipDepth。
在所有事件处理程序中,当且仅当 skipDepth == 0 时,将事件沿管道向下传递(通过调用 super.xxx(((。
如果你想变得聪明,你可以用通用的方式编写这个过滤器,所以它需要一个参数,这是一个回调函数,它接受节点名称和属性,并返回一个布尔值,指示是否跳过元素。然后,下次要跳过元素时,可以重复使用代码,但跳过条件不同。