【问题标题】:Skip the contents of an element in SAX parsing in Java在 Java 中跳过 SAX 解析中元素的内容
【发布时间】:2017-05-08 21:49:44
【问题描述】:

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

稍后添加:此外,我只知道是否在运行时跳过。在一个有点做作的例子中,我需要打开一个文件来处理&lt;sampletag&gt; 下的标签,如果找不到该文件,则不处理它们:

<sampledocument>
    <sampletag file="file1">
         <process/>
         <these/>
         <tags/>
         <if_file1_exists/>
    </sampletag>
    <sampletag file="file2">
         <process/>
         <these/>
         <tags/>
         <if_file2_exists/>
    </sampletag>
<sampledocument>

当然,我可以在处理程序代码中跟踪跳过,但这有点尴尬。我可以在 startElement() 方法中以某种方式告诉 SAX 跳过该元素的内容吗?

【问题讨论】:

    标签: java xml sax saxparser


    【解决方案1】:

    编写一个过滤器类,放在 SAX 解析器和现有 ContentHandler 之间的管道上。您可以通过扩展XMLFilterImpl 来做到这一点。这个过滤器应该有一个整数变量skipDepth,初始为零。

    在 startElement 中,如果您识别出要深度跳过的元素,或者如果 skipDepth > 0,则递增 skipDepth。

    在endElement中,如果skipDepth > 0,则递减skipDepth。

    在所有事件处理程序中,当且仅当 skipDepth == 0 时,将事件沿管道传递(通过调用 super.xxx())。

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

    【讨论】:

    • 谢谢!但这与简单地在 ContentHandler 中维护 skipDepth 有何不同?在我的实际任务中,ContentHandler 必须在确定是否跳过树之前实际处理元素,所以如果我有一个单独的过滤器,ContentHandler 无论如何都必须触发跳过。
    • SAX 代码总是最好写成管道,每个可分离任务的管道中的一个步骤。否则,您很快就会在 ContentHandler 中得到意大利面条代码(您已经说过这“有点尴尬”)。通过正确构建的管道,您最终会得到易于修改和调试的可维护、可重用的代码;如果您将所有内容都放在 ContentHandler 中,最终会导致无法维护的混乱。当然,如果您的示例与实际任务不同,那么我无法建议您如何分解实际任务中的功能。
    • 我已经修改了示例以在运行时测试文件。真正的代码验证配置的正确性,解释它如何验证它会提出一个很长的问题,但它是对一个单独的类的调用——有点类似于检查文件。
    • 以使现有答案无效的方式更改问题是完全不友好的。
    • 抱歉 - 我确实完全糊涂了。我已经恢复了之前的示例并在其后放置了新示例,因为在评论中提供新示例是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多