Domanda

ho bisogno di processo caricato da ResponseStream su Async callback XML progressivamente.

Reply è avere:

  <root>
     <node ...>
        .....
     </node>
     <node />
     ...
  </root>

schema e ho bisogno di avere la capacità di processo <node> prima del loro arrivo completo.

C'è modo normale per analizzarlo usando .NET norma?

È stato utile?

Soluzione

System.Xml.XmlTextReader 

"Rappresenta un lettore che fornisce velocemente, non in cache, forward-only l'accesso ai dati XML."

http://msdn.microsoft.com/en -us / library / system.xml.xmltextreader.aspx

Modifica: Questo è un trucco veloce, ma questo dimostra che il lettore è in realtà pigro.

 public class XmlTextReaderTest
    {
        public void RunTest()
        {
            var fs = new XmlTextReader(new Fs(@"c:\TestXml.xml"));
            while (fs.Read())
                File.AppendAllText(@"c:\xLog.txt", "Processing node..." + Environment.NewLine);
        }
    }

    public class Fs : FileStream
    {
        public Fs(string path)
            : base(path, FileMode.Open)
        {

        }

        public override int Read(byte[] array, int offset, int count)
        {
            File.AppendAllText(@"c:\xLog.txt", "Reading from stream..." + Environment.NewLine);
            var ans = base.Read(array, offset, count);
            return ans;
        }
}

Altri suggerimenti

Non chiamatelo il callback asincroni, non c'è bisogno di (credetemi, questo diventerà più chiaro ...).

Il responseStream caricherà le informazioni disponibili. Nel caso di un piccolo (per un bel grandi valori di "piccolo" Ho paura) torrente che non viene inviato chunked questo sarà quando l'intero flusso è stato scaricato. Tuttavia, se il flusso viene inviato con un trasferimento di codifica Chunked (questo è ciò che accade in ASP.NET se il buffer è disabilitati o Response.Flush() viene chiamato, altre tecnologie web server hanno i loro equivalenti) allora il flusso sarà disponibile presso il primo blocco .

Create il vostro XMLReader dal responseStream quando il GetResponse () è tornato. Si avviare l'elaborazione del primo blocco di essere disponibili, e di ottenere pezzi successivi man mano che arrivano abbastanza trasparente al codice.

Assicurati che il tuo occupano di questi nodi su una base come-disponibile in realtà avvantaggia il codice ulteriormente lungo la linea. Per esempio. se si output su console o una forma, fare così come ciascun nodo viene elaborato (o una piccola serie di nodi), mentre se si sta creando oggetti da questi nodi, quindi yield return loro piuttosto che costruire una collezione.

Ora, la cosa più importante qui è chiaramente la questione se il flusso web è chunked, piuttosto che il vostro codice di elaborazione. Se il produttore è un altro partito che non può essere persuaso a fare questo, allora si avrà bisogno di scendere a un livello più basso nella vostra trasformazione. Tuttavia, se questo è il caso, allora così facendo è molto probabile un falso ottimizzazione come l'intero processo sarà fatto sul loro fine, prima di inviare il primo byte, e che si erano il più grande ritardo sarà. In realtà, se il ritardo per ottenere l'intera scaricato risposta è un problema per il codice, allora si necessità loro di iniziare a inviare chunked come il ritardo con anche l'approccio più efficace da parte vostra sarà ancora troppo grande .

Per la cronaca, ho poco tempo fa ha confermato che, in un tale uso del XmlReader su un dealing WebResponse con i dati divisi in blocchi (dove ho controllato sia il codice client e server, e avrebbe potuto sia in esecuzione in un debugger e controllare sul ordine di funzionamento), l'elaborazione viene effettivamente fatto come ogni blocco è disponibile.

Sì, c'è un lettore che è possibile utilizzare. Fondamentalmente va lungo un ruscello e getta un evento per ogni elemento identifica (elemento, attributo, ecc.).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top