我制作了一个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方法的类时,我应该将其设置为内容处理程序吗?文件中的这一类。

先感谢您

最佳答案

DefaultHandler类完全不应包含main()方法。使用DefaultHandler类的方式有些棘手。它包含许多本应被覆盖的方法,因为默认情况下...它们什么也不做。

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

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

您可能想要覆盖的方法是startElement()endElement(),甚至还有characters()。您最可能使用的参数是localNameqNameattributes,它们实际上是Attribute对象的列表,它们的成员可以通过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

10-04 11:47