2010-07-21 11 views
6

Ich bin in einer Position, wo ich Java verwenden, um eine Verbindung zu einem TCP-Port und Streaming-XML-Dokumente nacheinander, jeweils mit dem Start <?xml des Dokument-Tags. Ein Beispiel, das das Format zeigt:Verwenden von SAX (Java) zum Analysieren mehrerer XML-Nachrichten aus einem einzigen TCP-Stream

<?xml version="1.0"?> 
<person> 
    <name>Fred Bloggs</name> 
</person> 
<?xml version="1.0"?> 
<person> 
    <name>Peter Jones</name> 
</person> 

Ich bin mit dem org.xml.sax.* api. Das SAX-Parsing funktioniert perfekt für das erste Dokument, sondern wirft eine Ausnahme, wenn es über den Beginn des zweiten Dokuments kommt:

Exception in thread "main" org.xml.sax.SAXParseException: The processing instruction 
target matching "[xX][mM][lL]" is not allowed. 

Die folgende Skelett-Klasse das Setup zeigt Ich verwende:

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xml.sax.helpers.XMLReaderFactory; 

import java.io.FileReader; 

public class XMLTest extends DefaultHandler { 

    public XMLTest() { 
    super(); 
    } 

    public static void main(String[] args) throws Exception { 
    XMLReader xr = XMLReaderFactory.createXMLReader(); 

    XMLTest handler = new XMLTest(); 
    xr.setContentHandler(handler); 
    xr.setErrorHandler(handler); 

    xr.parse(new InputSource(new Socket("127.0.0.1", 4555).getInputStream())); 
    } 
} 

Ich habe keine Kontrolle über das Format des XML (es ist ein Finanzdaten-Feed), aber ich muss in der Lage sein, es effizient zu parsen und alle Dokumente zu analysieren. Ich habe den Nachmittag/Abend damit verbracht, verschiedene Dinge auszuprobieren, aber keine Ergebnisse. Jede Hilfe würde sehr geschätzt werden.

+0

Sie müssen Parse für jedes separate Dokument aufrufen, was bedeutet, dass Sie den Eingabestream auf den '

+0

Ich musste so etwas tun und antwortete einfach (hier) (http://stackoverflow.com/questions/6711766/multiple-xml-files-in-one-stream/) alles in seinem eigenen Reader zu verpacken zur einfacheren Verwendung –

Antwort

6

Sie möchten den Stream auf jeder <?xml version="1.0"?> teilen und sie alle separat analysieren. Die BufferedReader kann dabei hilfreich sein. Kickoff-Beispiel:

+0

Wenn dies geschieht, wenn "Eingabe" ist "InputStream input = new Socket (" 127.0.0.1 ", 4500). GetInputStream();' Ich bekomme folgende Ausnahme: Ausnahme im Thread "main" java.io .FileNotFoundException:/Benutzer/admin/IdeaProjects/XMLTest/<(Keine solche Datei oder Verzeichnis) bei java.io.FileInputStream.open (native Methode) bei java.io.FileInputStream. (FileInputStream.java:106) bei java.io.FileInputStream. (FileInputStream.java:66) Es scheint, dass XR.parse() Zeichenfolgen nicht mag, auch wenn es als InputSource umgebrochen wird. – jkt

+0

Halten Sie sich für fähig, Stacktraces zu interpretieren? Ich sehe nicht, wie 'FileNotFoundException' damit zusammenhängt. Ich würde sagen, dein Problem liegt woanders, vielleicht in dem Schritt jenseits von Parsing. Die in der Ausnahmebedingungsnachricht gegebene Dateiname '/ Users/admin/IdeaProjects/XMLTest/<' sieht tatsächlich nicht gültig aus. Lesen Sie den StackTrace erneut, verfolgen Sie die richtige Position im Code, der dies verursacht hat, basierend auf den Zeilennummern im Trace, notieren Sie die Ursache und beheben Sie sie. Wenn Sie stecken bleiben und dieses Problem tatsächlich nicht mit dieser Frage zusammenhängt, stellen Sie eine neue Frage (z. B. "Wie speichere ich eine XML-Datei?"). – BalusC

+0

Hey, Ich kann Stacktraces lesen - ich habe nur die ersten paar Zeilen eingefügt. Der Stacktrace-Zeiger auf meinen Code ist 'at XMLTest.main (XMLTest.java:42)' und Zeile 42 ist: 'xr.parse (new InputSource (builder.toString()));' (was aus Ihrem obigen Beispiel hervorgeht) . Ich schätze Ihre Unterstützung dabei. – jkt