我制作了一个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()
。您最可能使用的参数是localName
,qName
和attributes
,它们实际上是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