Welchen XML Parser

Hallo ich habe folgendes Projekt:

Ich schriebe grade einen RSS Reader und bin bei der Fragestellung welchen XML Parser ich benutze, SAX, STAX oder DOM.

Ich muss die RSS Geschichte ja immer neu runterladen und gucken ob der oberste entry sich geändert hat. denke STAX wäre hier am angebrachtesten, da ich nich immer die komplette struktur einlesen muss.

Was denkt ihr?
 
Zuletzt bearbeitet:
Hallo,

Was heißt der "oberste" Eintrag? Ist das der erste Eintrag im XML File?
Wenn ja, könnte man das XML File auch partiell herunterladen( also nur die ersten X Zeilen) und dass dann in ein Dummy Element stecken, welches dann so klein ist, dass es fast egal ist ob man DOM, SAX oder StAX verwendet.

Gruß Tom
 
okay hab den sax benutzt, wie bekomm ich aus einer xml nur die texte zwischend en tags ausgelesen?

habe ein Object newsfeed dieses hat 3 strings, link, titel und description

wie paste ich diese aus der xml?

hier mein bisheriger code:

Code:
package NewsReader.util;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

import NewsReader.RSS.RssItem;

import java.io.FileReader;
import java.net.URL;

import java.util.LinkedList;
import java.util.Vector;


/**
 * XML Input class
 *
 * @author Antonio Bartulovic, Marius Quadflieg
  */
public class Input extends DefaultHandler {
    private Vector<RssItem> feed;
    private String rssFeed;
    private String link;
    private String title;
    private String description;

    /**
     * Creates a new Input object.
     * @param strb 
     */
    public Input(String rssFeed) {
    	this.rssFeed = rssFeed;

        try {
            initial();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Read xml file into memory
     *
     * @throws Exception
     */
    private void initial() throws Exception {
    	feed = new Vector<RssItem>();

        XMLReader xr = XMLReaderFactory.createXMLReader();
        xr.setContentHandler(this);
        xr.setErrorHandler(this);
        xr.parse(new InputSource(rssFeed));
    }

    /**
     * Defines the start element
     *
     * @param uri
     * @param localName
     * @param name
     * @param attributes
     *
     * @throws SAXException
     */
    public void startElement(String uri, String localName, String name,
        Attributes attributes) throws SAXException {
        if (name.equals("title")) {
           // was muss hier rein?
        }

        if (name.equals("description")) {
        	System.out.println(name); 
        }

        if (name.equals("link")) {
        	System.out.println(name); 
        }

    }

    /**
     * Returns a list of all parsed students
     *
     * @return students
     */
    public Vector<RssItem> getFeed() {
        return feed;
    }
}
 
habs nu so gelöst, geht doch irgendwie eleganter oder?

Code:
    public void startElement(String namespaceURI, String localName,
            String qName, Attributes atts) throws SAXException
    {

    	if(qName.equals("link"))
    		isLink = true;    	
    	
    	if(qName.equals("title"))
    		isTitle = true;    	
    	
    	if(qName.equals("description"))
    		isDescription = true; 
    }

    public void characters(char ch[], int start, int length)
    {
    	String s = new String(ch,start,length).trim();
       
	    if (s.length() > 0 && isTitle) {
	    	isTitle = false;
	        System.out.println("Title: " + s);
	    }
	        
	    if (s.length() > 0 && isLink) {
	      	isLink = false;
	        System.out.println("Link: " + s);
	    }
	    if (s.length() > 0 && isDescription) {
	    	isDescription = false;
	        System.out.println("Description: " + s);
	    }
    }
 
Hallo,

was du bei deiner Lösung beachten solltest ist, dass die Methode characters öfter aufgerufen werden kann. Also das der Text zwischen 2 Elementen nicht unbedingt bei einem mal geparst wird.
Da du im moment nur ein System.out.println machst, ist das jetzt noch egal, aber falls du was anderes machen möchtest und den String brauchst, solltest du das bedenken.
Die meiner Meinung nach beste Möglichkeit ist dann, den Text in der characters-Methode zusammen zu bauen und in der Methode endElement zu verarbeiten.

MFG

zEriX
 
Der String soll nicht in der endElement zusammengesetzt werden, sondern nur verarbeitet werden. Also das was du in der Methode character machst.

Es kann sein, wenn du zum Beispiel dass in deinem Text stehen hast &gt; dann würde die Character 3 mal aufgerufen, einmal für den Text der vor dem Zeichen steht, dann für das Zeichen und zuletzt für den Text danach. Da du den Text aber zusammen brauchst, musst du den halt in der Character-Methode zusammensetzen.

Ich hoffe du hast verstanden was ich meine.

MFG

zEriX
 
Zurück