11

我必须编辑一个 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!
}

非常感谢所有帮助。

4

2 回答 2

17

在 MemoryStream 准备好后,您可以简单地将此表达式添加到您的监视窗口:

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

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

这种情况在使用流调试代码时经常出现,因此我避免将它们用于简单的、自包含的任务。不幸的是,对于大型系统,提前知道是否应该使代码流面向并不总是那么容易,因为这在很大程度上取决于它将如何使用。然而,我认为在许多情况下使用流是一种过早的优化。

于 2009-05-29T16:13:12.613 回答
1

好的,不修改代码我没有成功使用调试器。我在下面的代码片段中添加了,它让我可以在其中放置一个断点或使用 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 对象,即使它破坏了执行流程,但与此同时,这是我管理过的最好的。

于 2009-05-06T17:50:51.947 回答