我必须编辑一个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!
}
所有人都非常感谢。
在MemoryStream准备就绪后,您可以简单地将此表达式添加到监视窗口:
(new StreamReader(xmlStream)).ReadToEnd();
监视表达式不需要是简单的变量值。它们可以是复杂的表达,但它们会产生副作用。正如您所指出的,这将中断执行,因为流内容将被完全读出。如果需要重新开始执行,可以在中断后使用另一个表达式重新创建流。
当使用流来调试代码时,这种情况经常出现,因此我将它们用于简单,自包含的任务。不幸的是,对于大型系统而言,事先并不容易知道是否应该使代码流面向,因为它在很大程度上取决于它的使用方式。但是,我认为在许多情况下使用流是不成熟的优化。
在MemoryStream准备就绪后,您可以简单地将此表达式添加到监视窗口:
(new StreamReader(xmlStream)).ReadToEnd();
监视表达式不需要是简单的变量值。它们可以是复杂的表达,但它们会产生副作用。正如您所指出的,这将中断执行,因为流内容将被完全读出。如果需要重新开始执行,可以在中断后使用另一个表达式重新创建流。
当使用流来调试代码时,这种情况经常出现,因此我将它们用于简单,自包含的任务。不幸的是,对于大型系统而言,事先并不容易知道是否应该使代码流面向,因为它在很大程度上取决于它的使用方式。但是,我认为在许多情况下使用流是不成熟的优化。
好的,我没有成功使用调试器而没有修改代码。我在下面的代码片段中添加了,它允许我放入断点或使用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!
}
我仍然宁愿简单地以某种方式查看调试器中的xmlstream对象,即使它破坏了执行流程,但同时这是我管理的最好的。