2010-07-21 9 views
6

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.

+0

È necessario chiamare il parse per ogni documento separato, il che significa che è necessario filtrare e suddividere il flusso di input sui caratteri "

+0

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 –

risposta

6

Desiderate dividere lo stream su ogni <?xml version="1.0"?> e analizzarli tutti separatamente. Il BufferedReader potrebbe essere utile in questo. Esempio kickoff:

reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
StringBuilder builder = null; 
for (String line; (line = reader.readLine()) != null;) { 
    if (line.startsWith("<?xml")) { 
     if (builder != null) { 
      xr.parse(new InputSource(builder.toString())); 
     } 
     builder = new StringBuilder(); 
    } 
    builder.append(line); 
} 
+0

nel fare questo quando 'input' è' ingresso InputStream = new Socket ("127.0.0.1", 4500) .getInputStream(); 'ottengo la seguente eccezione: Exception in thread java.io "principale" .FileNotFoundException:/Users/admin/IdeaProjects/XMLTest/<(Nessun file o directory di questo tipo) in java.io.FileInputStream.open (metodo nativo) in java.io.FileInputStream. (FileInputStream.java:106) in java.io.FileInputStream. (FileInputStream.java:66) Sembra che xr.parse() non ami le stringhe, anche quando è incapsulato come InputSource. – jkt

+0

Ti consideri capace di interpretare gli stacktraces? Non vedo come 'FileNotFoundException' è correlato a questo. Direi che il tuo problema sta da qualche altra parte, forse nel passaggio oltre l'analisi. Il messaggio di eccezione nel file filename '/ Users/admin/IdeaProjects/XMLTest/<' non sembra davvero valido btw. Rileggere lo stacktrace, eseguire il backtrace della posizione corretta nel codice che ha causato ciò in base ai numeri di riga nella traccia, individuare la causa principale e risolverlo. Se si blocca e questo problema non è effettivamente correlato a questa domanda, fare una nuova domanda (ad esempio "Come salvare un file XML?"). – BalusC

+0

Ehi, Posso leggere gli stacktrack: ho incollato solo le prime righe. Il puntatore stacktrace al mio codice è 'a XMLTest.main (XMLTest.java:42)' e la riga 42 è: 'xr.parse (new InputSource (builder.toString()));' (che è il tuo esempio precedente) . Apprezzo il tuo aiuto con questo. – jkt