2009-05-06 6 views
11

Devo modificare un foglio di stile XSLT, ma sto volando cieco perché l'input XML esiste solo fugacemente in un gruppo di stream. Posso eseguire il debug nel codice, ma non riesco a capire come ottenere il contenuto dei flussi in un testo che posso guardare (e scorrere XSLT manualmente mentre li sto modificando).Come ispezionare stream XML dal debugger in Visual Studio 2003

Il codice fa parte di un grande vecchio sistema legacy, è possibile modificarlo in un ambiente di debug se assolutamente necessario, ma viene eseguito in un servizio Windows collegato a un gruppo di MSMQ. Quindi per vari motivi preferirei poter usare il debugger per vedere l'XML senza dover prima modificare il codice.

codice molto semplificata, è qualcosa di simile: (C# - ma ricordatevi che è .net 1.1 in VS 2003)

Questa è la funzione che ottiene l'XML come un flusso, che viene poi immessa in una sorta di oggetto trasformazione XSLT. Ho provato a guardare gli oggetti writer e xmlStream nelle finestre di controllo e nella finestra immediata, ma non riesco a capire come vedere l'effettivo XML.

private MemoryStream GetXml() 
{ 
    MemoryStream xmlStream; 
    xmlStream = new MemoryStream(); 
    XmlWriter writer = new XmlTextWriter(xmlStream, Encoding.UTF8); 
    writer.WriteStartDocument(); 
    //etc etc... 
    writer.WriteEndDocument(); 
    writer.Flush(); 
    xmlStream.Position = 0; 
    return xmlStream; //Goes off to XSLT transform thingy! 
} 

Tutti gli aiuti molto apprezzati.

risposta

14

Si potrebbe semplicemente aggiungere questa espressione alla vostra finestra di controllo dopo che il MemoryStream è pronto:

(new StreamReader(xmlStream)).ReadToEnd(); 

Guarda espressioni non devono essere semplici valori delle variabili. Possono essere espressioni complesse, ma avranno effetti collaterali. Come hai notato, questo interromperà l'esecuzione, dal momento che i contenuti del flusso verranno letti completamente. È possibile ricreare il flusso dopo l'interruzione con un'altra espressione, se è necessario riavviare l'esecuzione.

Questa situazione si verifica frequentemente durante il debug del codice con flussi, quindi li evito per compiti semplici e autonomi. Sfortunatamente, per i sistemi di grandi dimensioni, non è sempre facile sapere in anticipo se è necessario rendere il codice orientato al flusso o meno, poiché dipende molto da come verrà utilizzato. Ritengo, tuttavia, che l'uso dei flussi sia un'ottimizzazione prematura in molti casi.

+2

Per chiunque incontri questa risposta da Google (come ho fatto io), tieni presente che potrebbe essere necessario reimpostare il puntatore Stream all'inizio se è già stato letto da. Questo può essere fatto usando 'xmlStream.Position = 0;' o 'xmlStream.Seek (0, SeekOrigin.Begin);'. Poiché l'espressione guardata non si aggiorna automaticamente dopo averlo fatto, ti consiglio di eseguire entrambi i comandi dalla Finestra Immediata. –

0

OK, non sono riuscito a utilizzare il debugger senza modificare il codice. Ho aggiunto il seguente frammento, che mi consente di inserire un punto di interruzione o utilizzare debugview.

private MemoryStream GetXml() 
{ 
    MemoryStream xmlStream; 
    xmlStream = new MemoryStream(); 
    XmlWriter writer = new XmlTextWriter(xmlStream, Encoding.UTF8); 
    writer.WriteStartDocument(); 
    //etc etc... 
    writer.WriteEndDocument(); 
    writer.Flush(); 
    xmlStream.Position = 0; 

    #if DEBUG 
    string temp; 
    StreamReader st=new StreamReader(xmlStream); 
    temp=st.ReadToEnd(); 
    Debug.WriteLine(temp); 
    #endif 

    return xmlStream; //Goes off to XSLT transform thingy! 
} 

sarei ancora preferisco guardare semplicemente l'oggetto xmlstream nel debugger in qualche modo, anche se si interrompe il flusso di esecuzione, ma nel frattempo questo è il migliore che sono riuscito.