Aggiornamento Non esiste un parser XML pronto nella comunità Java che possa eseguire l'analisi NIO e XML. Questo è il più vicino che ho trovato, ed è incompleta: http://wiki.fasterxml.com/AaltoHomeXMLStreamReader e un flusso reale
ho il seguente codice:
InputStream input = ...;
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(input, "UTF-8");
domanda è, perché il metodo #createXMLStreamReader() si aspetta di avere un intero documento XML in ingresso lo streaming? Perché si chiama "lettore di stream", se non sembra che elabori una porzione di dati XML? Per esempio, se mi nutro:
<root>
<child>
, mi direbbe che mi mancano i tag di chiusura. Anche prima di iniziare a ripetere il lettore di stream stesso. Ho il sospetto che non so come usare correttamente un XMLStreamReader. Dovrei essere in grado di fornirgli dati a pezzi, giusto? Ne ho bisogno perché sto elaborando un flusso XML proveniente dal socket di rete e non voglio caricare l'intero testo sorgente in memoria.
Grazie per l'aiuto, Yuri.
Sì, potenzialmente lo stream deve contenere un intero documento. Ma perché XMLStreamReader dovrebbe provare a convalidare tutto in anticipo? È un flusso. Perché non può semplicemente andare insieme ai dati e analizzare tutto ciò che è disponibile? E * se * incontra un errore, vorrei affrontarlo da solo. Correggimi se ho torto - stai dicendo che se sto leggendo un documento XML da 1 gigabyte su una rete, dovrei scaricare tutto e solo allora XMLStreamReader sarebbe in grado di scorrere su di esso? –
Penso che non verrebbe convalidato finché l'intero stream non sarà stato elaborato (e chiuso). Non dovresti scaricare tutto, ecco a cosa servono i flussi. Stai scrivendo sul flusso e poi lo chiudi e stai cercando di scrivere di più? – cjstehno
Yuri, no, i parser di Stax NON lo leggeranno prima per intero; puoi sicuramente iniziare a leggere subito, e il parser bloccherà solo se non ha ancora dati da analizzare. Non so quale sia il problema, ma la tua comprensione è corretta. – StaxMan