【问题标题】:Java SAX: how to use DefaultHandler in the main classJava SAX:如何在主类中使用 DefaultHandler
【发布时间】:2016-07-12 15:59:52
【问题描述】:

我制作了一个 sax 解析器,主类具有 main 方法,并使用 XMLReader.setContentHandler(myCustomParserClass) 设置解析器,这是一个扩展 DefaultHandler 的单独类:

 public class SAXHandler {

    public static void Main(String args[]) {
       XMLReader.setContentHandler(myCustomParserClass); } 
  }

  class MyCustomParserClass extends DefaultHandler { ... }

但是我有一个问题。是赋值,条件是主类要继承DefaultHandler,如:

    class SAXHandler extends DefaultHandler {

      public static void main(String args[]) { ... }

      public void startElement(String uri...) { }
      public void endElement(String uri...) { }

而且我真的不知道如何实现 XMLReader,当作为解析器的类...也是具有 main 方法的类并且必须有时,我应该将什么设置为内容处理程序文件中只有这一类。

提前谢谢你

【问题讨论】:

  • 我不太喜欢 SAX,据我所见,XML 有更好的选择,但它是用于作业的,因此必须在应用程序中使用 SAX,因为它自动检查是否符合标准。
  • 你会因为不使用它而被解雇......你应该退出:)

标签: java xml class sax


【解决方案1】:

DefaultHandler 类根本不应该包含main() 方法。使用 DefaultHandler 类的方式有点棘手。它包含许多旨在被覆盖的方法,因为默认情况下......它们什么都不做。

SAXParser 通过顺序读取 XML 文件来工作。它检测 XML 节点何时打开或关闭,并使用 DefaultHandler 子类(在您的情况下为 SAXHandler)来确定每个节点打开或关闭时要执行的操作。将 DefaultHandler 类视为某种字典会很有帮助,解析器将在读取 XML 时将其用作参考。

startElement()在解析器检测到节点的开始标签时调用,endElement()在解析器检测到节点的结束标签时调用。这些方法中的每一个的参数都包含有关节点本身的信息,这些信息是从解析器传回的。您在这些方法中编写的代码告诉解析器在遇到相应的开始/结束标记时要做什么。

您可能想要覆盖的方法是startElement()endElement(),还可能还有characters()。您最可能使用的参数是localNameqNameattributes,这实际上是Attribute 对象的列表,可以使用getIndex(int index) 访问其成员,使用getIndex(int index) 可以访问其值getValue()

看看这个教程,这是我学习如何使用 SAX 的方法;该演示帮助我清楚地了解: http://www.tutorialspoint.com/java_xml/java_sax_parser.htm

DefaultHandler 的文档: https://docs.oracle.com/javase/7/docs/api/org/xml/sax/helpers/DefaultHandler.html

【讨论】:

  • 是的,确切地说,在我的解决方案中,我有一个单独的类来实现 DeafultHandler,然后在我的主类中使用该类,DeafultHandler 与主类的使用看起来确实很奇怪,如果不是我也错了。但是,我解决了我这样实例化它的问题:setContentHandler(new MainClass()),并且它起作用了。
猜你喜欢
  • 2011-09-03
  • 2013-03-26
  • 2016-10-12
  • 2011-06-02
  • 2015-09-29
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多