wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun?

berserkerdq2

Bekanntes Mitglied
Java:
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
       
    }


    public void endElement(String uri, String localName, String qName) throws SAXException {
        // TODO
    }


Ich habe die API durchgelesen und kapiere jetzt noch weniger, ich habe eine XML Datei, aber was genau soll ich nun tun, für was ist dieser String uri, String localName, Stringqname und Attributes Atts??? Was genau soll ich damit den anfangen?
 
Beste Antwort
Wenn du SAX benutzt, musst du einiges selber tun.

Wenn du dagegen DOM bentutzt, wird dir vieles abgenommen; es wird aber das gesamte XML-Dokumnet auf einmal eingelesen und benötigt entsprechend viel Arbeitsspeicher.
Das sollte aber bei kleinen Dokumenten und dem heute verfügbaren Arbeitsspeicher kein Problem sein.
ich von jedem Internship, wovon ich ca. 1030 habe
Bei solchen Mengen sehe ich jedenfalls kein Problem.
Schaue erstmal in die JavaDoc/Dokumentation des Interfaces https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html

Hier ist dann auch die Dokumentation der Methoden:
startElement(): https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

endElement(): https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html#endElement(java.lang.String, java.lang.String, java.lang.String)

Das kann man als "Callback"-Methoden bezeichnen, denn der XML Parser ruft diese Methoden in einer von dir bereitgestellten Instanz einer Klasse, die ContentHandler implementiert, auf, um dich darüber zu benachrichtigen, dass der Parser gerade ein öffnendes XML-Tag oder ein schließendes XML-Tag gelesen hat.
Es erlaubt dir, basierend auf den in den Parametern übergebenen Informationen, diese Ereignisse zu verarbeiten.

Was genau soll ich damit den anfangen?
Es kommt jetzt halt darauf an, was du mit den Ereignissen "XML-Start-Tag bzw. End-Tag wurde gelesen" genau machen möchtest.
Also: Was willst du denn überhaupt tun?
 
Schaue erstmal in die JavaDoc/Dokumentation des Interfaces https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html

Hier ist dann auch die Dokumentation der Methoden:
startElement(): https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)

endElement(): https://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html#endElement(java.lang.String, java.lang.String, java.lang.String)

Das kann man als "Callback"-Methoden bezeichnen, denn der XML Parser ruft diese Methoden in einer von dir bereitgestellten Instanz einer Klasse, die ContentHandler implementiert, auf, um dich darüber zu benachrichtigen, dass der Parser gerade ein öffnendes XML-Tag oder ein schließendes XML-Tag gelesen hat.
Es erlaubt dir, basierend auf den in den Parametern übergebenen Informationen, diese Ereignisse zu verarbeiten. Es kommt jetzt halt darauf an, was du mit den Ereignissen "XML-Start-Tag bzw. End-Tag wurde gelesen" genau machen möchtest.
Hi, ich habe eine XML-Datei die ein Haufen solcher Einträge besitzt:


Java:
<Internship typ="boss" unic="open" murt="hallo">
<Gegeben>ist</Gegeben>
<Status>ok</Status>
<Geld>10</Geld>

Die Sache ist nun, dass ich von jedem Internship, wovon ich ca. 1030 habe, einzeln den typ nehmen soll, sowie das Geld und das in einem Attribut speichern soll, aber wie greife ich da bei startElement() zu?
 
Nehme dir bitte erstmal die Zeit, und lese die Dokumentation des Interfaces und der referenzierten Methoden. Dort wird alles erklärt.
Diese Methoden werden vom Parser aufgerufen, und du kannst dann in der Implementierung der Methoden, die du selber bereitstellst, alles tun, was du musst - basierend auf den dir per Parameter übergebenen Informationen des jeweiligen XML-Elementes.
 
Nehme dir bitte erstmal die Zeit, und lese die Dokumentation des Interfaces und der referenzierten Methoden. Dort wird alles erklärt.
Diese Methoden werden vom Parser aufgerufen, und du kannst dann in der Implementierung der Methoden, die du selber bereitstellst, alles tun, was du musst - basierend auf den dir per Parameter übergebenen Informationen des jeweiligen XML-Elementes.
Korrekt mein Problem ist, was ich nicht verstehe für was sind alle Strings, außer qname? Qname kann ja bei unserem Beispiel Internship, sien, aber zugleich auch Status und Geld oder? Das habe ich zumindest bei der Dokumentation verstanden, für was ist dann localname und quri?

Wenn ich z. B. das Geld will:

[CODE lang="java" title="i"]if(qname.equals("Geld")){
Variable=att.getValue("Geld");
}

oder? Das wäre dann korrekt?[/CODE]
 
Du hast hoffentlich auch ein schließendes Tag von "Internship", also
Code:
<Internship typ="boss" unic="open" murt="hallo">
    <Gegeben>ist</Gegeben>
    <Status>ok</Status>
    <Geld>10</Geld>
</Internship>

Sobald die erste Zeile (<Internship typ="boss" unic="open" murt="hallo"> vom Parser gelesen wird,
wird startElement(...) aufgerufen. Dabei werden dir die wichtigen Informationen übergeben.
Du könntest hier zum Beispiel ein neues Objekt erzeugen und die Attribute in dem Objekt speichern.

Sobald die zweite Zeile (<Gegeben>ist</Gegeben> gelesen wir, wird zunächst wieder startElement(...) aufgerufen; du weißt nun also, dass du im Element "Gegeben" bist. Anschließend wird characters(...) aufgerufen (hier erhälst du die Information "ist". Du kannst nun ggf. in den erzeugten Object diesen Wert speichern.
Das danach aufgerufene "endElement(...) kannst du möglicherweise ignorieren.
"Status" und "Geld" funktionieren analog.

Beim Aufruf von "endElement()" für "Intership" könntest du das gefüllte neue Objekt beispielsweise in der Datenbank speichern.
 
Korrekt mein Problem ist, was ich nicht verstehe für was sind alle Strings, außer qname? Qname kann ja bei unserem Beispiel Internship, sien, aber zugleich auch Status und Geld oder? Das habe ich zumindest bei der Dokumentation verstanden, für was ist dann localname und quri?
Diese Werte sind nur interessant, wenn du "Namespaces" in deinem XML-Dokument hast.
 
Du hast hoffentlich auch ein schließendes Tag von "Internship", also
Code:
<Internship typ="boss" unic="open" murt="hallo">
    <Gegeben>ist</Gegeben>
    <Status>ok</Status>
    <Geld>10</Geld>
</Internship>

Sobald die erste Zeile (<Internship typ="boss" unic="open" murt="hallo"> vom Parser gelesen wird,
wird startElement(...) aufgerufen. Dabei werden dir die wichtigen Informationen übergeben.
Du könntest hier zum Beispiel ein neues Objekt erzeugen und die Attribute in dem Objekt speichern.

Sobald die zweite Zeile (<Gegeben>ist</Gegeben> gelesen wir, wird zunächst wieder startElement(...) aufgerufen; du weißt nun also, dass du im Element "Gegeben" bist. Anschließend wird characters(...) aufgerufen (hier erhälst du die Information "ist". Du kannst nun ggf. in den erzeugten Object diesen Wert speichern.
Das danach aufgerufene "endElement(...) kannst du möglicherweise ignorieren.
"Status" und "Geld" funktionieren analog.

Beim Aufruf von "endElement()" für "Intership" könntest du das gefüllte neue Objekt beispielsweise in der Datenbank speichern.
Danke, aber wie prüfe ich ob ich bei Geld bin? Wenn ich bei <Geld>10</Geld> bin, also in der Zeile, kann ich das mit qName prüfen?

Also if(qName.equals("Geld"){...}?
 
Genau, aber wie greife ich auf das letzte Tag zu? Damit ich mir das merken kann?
Java:
public class myContentHandler implements org.sax.CotnetHandler {
   String lastTag = null;
   public void startElement(String uri,  Stirng localName, Srting qName, Attierbute atts) throws SAXException {
      // tu dies oder jenes
      lastTag = qName;
   }
   public void characters(char[] ch, int start,  int length) throws SAXException {
      // tu dies oder jenes
      if ( lastTag.equals("Geld")) {
         // speicher den Inhalt
      }
   }
}
 
Wenn du SAX benutzt, musst du einiges selber tun.

Wenn du dagegen DOM bentutzt, wird dir vieles abgenommen; es wird aber das gesamte XML-Dokumnet auf einmal eingelesen und benötigt entsprechend viel Arbeitsspeicher.
Das sollte aber bei kleinen Dokumenten und dem heute verfügbaren Arbeitsspeicher kein Problem sein.
ich von jedem Internship, wovon ich ca. 1030 habe
Bei solchen Mengen sehe ich jedenfalls kein Problem.
 
Beste Antwort

Neue Themen


Zurück
Oben