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.
Sie müssen Parse für jedes separate Dokument aufrufen, was bedeutet, dass Sie den Eingabestream auf den ' Xml' Zeichen filtern und aufteilen müssen. –
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 –