2009-05-06 10 views
11

Tengo que editar una hoja de estilos XSLT, pero estoy volando a ciegas porque la entrada XML solo existe fugazmente en un conjunto de secuencias. Puedo depurar el código, pero no puedo encontrar la manera de obtener el contenido de las secuencias en un texto que pueda ver (y ejecutar manualmente el XSLT mientras lo estoy editando).Cómo inspeccionar secuencias XML desde el depurador en Visual Studio 2003

El código es parte de un gran sistema antiguo heredado, puedo modificarlo en un entorno de depuración si es absolutamente necesario, pero se ejecuta en un servicio de Windows conectado a un grupo de MSMQ. Por varias razones, prefiero usar el depurador para ver el XML sin tener que cambiar primero el código.

código mucho más simplificada, es algo como esto: (C# -, pero recuerda que es .NET 1.1 en VS 2003)

Ésta es la función que recibe el XML como una corriente, que se alimenta entonces en una especie del objeto de transformación XSLT. Intenté mirar el escritor y los objetos xmlStream en las ventanas del reloj y la ventana inmediata, pero no puedo entender cómo ver el XML real.

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! 
} 

Toda ayuda muy apreciada.

Respuesta

14

Usted puede simplemente añadir esta expresión a la ventana de su reloj después de la MemoryStream está listo: expresiones

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

reloj no necesitan ser valores de las variables simples. Pueden ser expresiones complejas, pero tendrán efectos secundarios. Como ha notado, esto interrumpirá la ejecución, ya que los contenidos de la secuencia se leerán por completo. Podría volver a crear la secuencia después de la interrupción con otra expresión, si necesita reiniciar la ejecución.

Esta situación se presenta con frecuencia al depurar código con transmisiones, por lo que las evito para tareas simples e independientes. Desafortunadamente, para sistemas grandes, no siempre es fácil saber de antemano si debe orientar o no su código, ya que depende en gran medida de cómo se utilizará. Sin embargo, considero que el uso de flujos es una optimización prematura en muchos casos.

+2

Para cualquier persona que se encuentre con esta respuesta de Google (como yo lo hice), tenga en cuenta que puede que necesite restablecer el puntero de Stream al principio si ya se ha leído. Esto se puede hacer usando 'xmlStream.Position = 0;' o 'xmlStream.Seek (0, SeekOrigin.Begin);'. Como la expresión observada no se actualiza automáticamente después de hacer esto, recomiendo ejecutar ambos comandos desde la ventana Inmediato. –

0

OK, no he podido utilizar el depurador sin modificar el código. Agregué el siguiente fragmento de código, que me permite poner un punto de interrupción o usar la depuración.

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! 
} 

yo prefiero mirar simplemente el objeto xmlstream en el depurador de alguna manera, incluso si se interrumpe el flujo de ejecución, pero mientras tanto, este es el mejor que he logrado.

Cuestiones relacionadas