在 Java 中的 SAX 解析中跳过元素的内容



我正在解析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(((。

如果你想变得聪明,你可以用通用的方式编写这个过滤器,所以它需要一个参数,这是一个回调函数,它接受节点名称和属性,并返回一个布尔值,指示是否跳过元素。然后,下次要跳过元素时,可以重复使用代码,但跳过条件不同。

最新更新