如何在Visual Studio 2003中检查调试器中的XML流

And*_*w M 11 c# xml .net-1.1 visual-studio-2003 stream

我必须编辑一个XSLT样式表,但我是盲目的,因为XML输入仅在一堆流中短暂存在.我可以调试代码,但无法弄清楚如何将流的内容输出到我可以看到的文本中(并在我编辑它们时手动运行XSLT).

代码是一个很大的遗留系统的一部分,我可以在调试环境中修改它,如果绝对必要,但它运行在一个连接到一堆MSMQ的Windows服务中.因此,出于各种原因,我宁愿能够使用调试器来查看XML,而无需先更改代码.

代码大大简化了,就像这样:( C# - 但在VS 2003中记住它是.net 1.1.)

这是将XML作为流获取的函数,然后将其提供给某种XSLT转换对象.我已经尝试在监视窗口和即时窗口中查看writer和xmlStream对象,但无法理解如何查看实际的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!
}
Run Code Online (Sandbox Code Playgroud)

所有人都非常感谢.

Pet*_*ebb 14

您可以在MemoryStream准备就绪后将此表达式添加到监视窗口:

(new StreamReader(xmlStream)).ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

监视表达式不需要是简单的变量值.它们可以是复杂的表达,但它们会产生副作用.正如您所指出的,这将中断执行,因为流内容将被完全读出.如果需要重新开始执行,可以在中断后使用另一个表达式重新创建流.

当使用流来调试代码时,这种情况经常出现,因此我将它们用于简单,自包含的任务.不幸的是,对于大型系统而言,事先并不容易知道是否应该使代码流面向,因为它在很大程度上取决于它的使用方式.但是,我认为在许多情况下使用流是不成熟的优化.

  • 对于那些遇到谷歌这个答案的人(就像我做的那样),请记住,如果已经从中读取过,可能需要将Stream指针重置为开头.这可以使用`xmlStream.Position = 0;`或`xmlStream.Seek(0,SeekOrigin.Begin);`来完成.由于监视的表达式在执行此操作后不会自动更新,因此我建议从立即窗口执行这两个命令. (3认同)