【问题标题】:How to inspect XML streams from the debugger in Visual Studio 2003如何在 Visual Studio 2003 的调试器中检查 XML 流
【发布时间】:2009-05-06 16:17:23
【问题描述】:

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

非常感谢所有帮助。

【问题讨论】:

    标签: c# xml stream .net-1.1 visual-studio-2003


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 对于从 Google 看到这个答案的任何人(就像我一样),还请记住,如果已经读取 Stream 指针,您可能需要将其重置为开头。这可以使用xmlStream.Position = 0;xmlStream.Seek(0, SeekOrigin.Begin); 来完成。由于监视的表达式在执行此操作后不会自动更新,我建议从即时窗口执行这两个命令。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多