2016-03-24 2 views
0

I ein SAX-Parser vorgenommen haben, die Hauptklasse hat, dass die Hauptmethode hat, und Einstellen der Parser XMLReader.setContentHandler(myCustomParserClass), die eine separate Klasse ist, die Default erstreckt:Java SAX: Wie Default in der Hauptklasse verwenden

public class SAXHandler { 

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

    class MyCustomParserClass extends DefaultHandler { ... } 

Aber ich habe ein Problem. Es ist eine Zuordnung, und die Bedingung ist, dass die Hauptklasse der Default, wie zu erweitern hat:

class SAXHandler extends DefaultHandler { 

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

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

Und ich habe nicht wirklich eine Idee, wie ich die XMLReader implementieren, was kann ich als Der Content-Handler, wenn die Klasse, die der Parser ist, auch die Klasse mit der Hauptmethode ist, und es muss nur eine Klasse in der Datei vorhanden sein.

Vielen Dank im Voraus

+1

ein Muss für Ihre App demonstriert? Vtd-Xml eine Option, die Sie vielleicht in Betracht ziehen? –

+0

Ich mag SAX nicht wirklich, von dem, was ich gesehen habe, gibt es bessere Optionen für XML, aber es war für eine Aufgabe, also war es zwingend notwendig, SAX in der App zu verwenden, da es automatisch auf Einhaltung der Kriterien. – user3104270

+0

Sie werden gefeuert für die Verwendung nicht ... Sie sollten aufhören :) –

Antwort

1

Die Default Klasse überhaupt nicht ein main() Verfahren enthalten sollte. Die Art, wie Sie die DefaultHandler-Klasse verwenden, ist etwas schwierig. Es enthält eine Reihe von Methoden, die überschrieben werden sollen, weil sie standardmäßig nichts tun.

Der SAXParser funktioniert durch sequentielles Lesen der XML-Datei. Es erkennt, wenn ein XML-Knoten geöffnet oder geschlossen wird, und verwendet eine DefaultHandler-Unterklasse (in Ihrem Fall SAXHandler), um zu bestimmen, was zu tun ist, wenn jeder Knoten geöffnet oder geschlossen wird. Es ist hilfreich, sich die DefaultHandler-Klasse als ein Verzeichnis von Arten vorzustellen, das der Parser beim Lesen der XML-Datei als Referenz verwenden wird.

startElement() wird aufgerufen, wenn der Parser ein öffnendes Tag eines Knotens erkennt, und endElement() wird aufgerufen, wenn der Parser ein schließendes Tag eines Knotens erkennt. Die Parameter jeder dieser Methoden enthalten Informationen über den Knoten selbst, die vom Parser zurückgegeben wurden. Der Code, den Sie in diesen Methoden schreiben, teilt dem Parser mit, was er tun soll, wenn er die entsprechenden öffnenden/schließenden Tags findet. Die Methoden, die Sie wahrscheinlich überschreiben werden, sind startElement(), endElement() und möglicherweise auch characters(). Die Parameter, die Sie am wahrscheinlichsten verwenden, sind localName, qName und attributes, was wirklich eine Liste von Attribute Objekten ist, auf deren Mitglieder mit getIndex(int index) zugegriffen werden kann und auf deren Werte mit getValue() zugegriffen werden kann.

Werfen Sie einen Blick auf dieses Tutorial, ich habe gelernt, wie man SAX benutzt; Die Demo wurde, was hilft es für mich klar zu machen: http://www.tutorialspoint.com/java_xml/java_sax_parser.htm

Dokumentation für Default: https://docs.oracle.com/javase/7/docs/api/org/xml/sax/helpers/DefaultHandler.html

+0

Ja, genau, in meiner Lösung hatte ich eine separate Klasse, die den DeafultHandler implementiert, und dann diese Klasse in meiner Hauptklasse, die Verwendung des DeafultHandler mit der Hauptklasse scheint seltsam, wenn auch nicht falsch zu mir. Wie auch immer, ich habe es gelöst, dass ich es so instanziiert habe: 'setContentHandler (new MainClass())', und es hat funktioniert. – user3104270