XML Daten aus einem Stream einlesen

Ich stehe gerade vor einem kleinen Problem, ich will XML Daten über einen Stream einlesen jedoch wird da nicht gesagt das alle Daten da sind wie zB bei einer Datei.
Das ganze geschied über einen Socket und wird in Java gemacht. Meine derzeitige Idee war es einfach alles einzulesen und nachzusehn wann der Tag zum Schließen kommt und das dann alles zu parsen. Hat da jemand eine bessere Idee?
Außerdem kennt ihr eine gute Lib für XML, sie soll einfach zu bedienen sein, wenig Ressourcen brauchen und vorallem auch gegen XSD und DTD validieren können.

Wie schauts denn aus wenn du dir das XML-File auf den Rechner lädst und dann mit JDOM o.ä. drüber rauschst? Oder MUSS es zwingend mit dem Stream sein?

Wie soll ich es auf den Rechner laden? Da weiß ich doch auch nicht wann es zu ende ist.

Kannst du nicht direkt den eingebauten SAXParser verwenden? Mit einem selbst geschriebenen ContentHandler kannst du die Eingabe schon verwenden, wenn noch nichtmal die halbe Datei eingelesen ist (siehe Beispiel unten).

Die SAXParserFactory hat auch eine Methode ein Schema zu setzen, damit wird sich irgendwie ein Test basteln lassen (wie man die DTD einbindet, weiss ich leider nicht)


import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Test {
	private static final String INPUT = "<xml><bla><test a=\"12\"/><test a=\"13\"/></bla></xml>";
	
	public static void main(String[] args)  throws IOException, ParserConfigurationException, SAXException{
		PipedInputStream reader = new PipedInputStream();
		SlowSource source = new SlowSource( reader );
		
		Handler handler = new Handler();
		
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		
		source.start();
		parser.parse( reader, handler );
	}
	
	private static class Handler extends DefaultHandler{
		@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
			System.out.println( "Start: " + qName );
			for( int i = 0, n = attributes.getLength(); i<n; i++ ){
				System.out.println( "qName." + attributes.getQName( i ) + " = " + attributes.getValue( i ));
			}
		}
		
		@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			System.out.println( "End: " + qName );
		}
	}
	
	private static class SlowSource extends Thread{
		private PipedOutputStream writer;
		
		public SlowSource( PipedInputStream reader ) throws IOException{
			writer = new PipedOutputStream();
			writer.connect( reader );
		}
		
		@Override
		public void run() {
			try{
				for( int i = 0, n = INPUT.length(); i<n; i++){
					char next = INPUT.charAt( i );
					System.out.println( "-> " + next );
					writer.write( next );
					Thread.sleep( 250 );
				}
				
				writer.close();
			}
			catch( IOException ex ){
				ex.printStackTrace();
			}
			catch( InterruptedException ex ){
				ex.printStackTrace();
			}
		}
	}
}```

Dieser Beitrag veranschaulicht die Verwendung der Klasse XmlTextReader zum Lesen von XML-Daten (Extensible Markup Language) aus einem Stream. Der Stream kann aus einer Vielzahl von Quellen stammen, wie z. B. einem Bytestream von einem Server, einer Datei oder einer TextReader -Klasse.