Sono in una posizione in cui utilizzo Java per connettermi a una porta TCP e sono documenti XML in streaming uno dopo l'altro, ciascuno delimitato con <?xml
start del tag del documento. Un esempio che dimostra il formato:Utilizzo di SAX (Java) per analizzare più messaggi XML da un singolo flusso TCP
<?xml version="1.0"?>
<person>
<name>Fred Bloggs</name>
</person>
<?xml version="1.0"?>
<person>
<name>Peter Jones</name>
</person>
sto usando il org.xml.sax.*
api. L'analisi SAX funziona perfettamente per il primo documento, ma genera un'eccezione quando si incontra l'inizio del secondo documento:
Exception in thread "main" org.xml.sax.SAXParseException: The processing instruction
target matching "[xX][mM][lL]" is not allowed.
La seguente classe di scheletro dimostra la messa a punto che sto utilizzando:
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()));
}
}
Non ho alcun controllo sul formato di xml (è un feed di dati finanziari), ma ho bisogno di essere in grado di analizzarlo in modo efficiente e analizzare tutti i documenti. Ho passato il pomeriggio/sera a provare cose diverse ma nessuna ha dato risultati. Qualsiasi aiuto sarebbe molto apprezzato.
È necessario chiamare il parse per ogni documento separato, il che significa che è necessario filtrare e suddividere il flusso di input sui caratteri " Xml". –
Ho dovuto fare qualcosa del genere e ho appena risposto (a me stesso) [qui] (http://stackoverflow.com/questions/6711766/multiple-xml-files-in-one-stream/) avvolgendo tutto nel proprio Reader per l'uso più semplice –