2009-05-06 48 views
11

我必須編輯XSLT樣式表,但是由於XML輸入僅存在於一堆流中,所以我不知情。我可以調試到代碼中,但無法弄清楚如何將流的內容輸出到我可以查看的文本中(並且在我編輯它們時手動運行XSLT)。如何檢查Visual Studio 2003中的調試器中的XML流

該代碼是一個很大的舊式遺留系統的一部分,如果絕對必要,我可以在調試環境中修改它,但它運行在一個連接到一堆MSMQ的Windows服務中。因此,出於各種原因,我寧願能夠使用調試器查看XML,而無需先更改代碼。

代碼更簡單,是這樣的:(C# - 但請記住它的.Net 1.1 VS 2003)

這是獲取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! 
} 

所有的幫助非常感謝。

回答

14

你可以這樣表達只是添加到您的監視窗口後,MemoryStream的準備:

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

監視表達式不必是簡單的變量值。他們可以是複雜的表達,但他們會有副作用。如您所知,這會中斷執行,因爲流內容將被完全讀出。如果需要重新開始執行,則可以在用另一個表達式中斷後重新創建流。

當使用流調試代碼時,這種情況經常會出現,所以我避免使用這些簡單的自包含任務。不幸的是,對於大型系統,事先並不容易知道你是否應該使你的代碼流爲導向,因爲它很大程度上取決於它將如何使用。然而,我認爲在很多情況下使用流是一種不成熟的優化。

+2

對於任何從Google接收到此答案的人(如我所做的那樣),請記住,如果已經讀取了Stream指針,則可能需要將Stream指針重置爲開頭。這可以使用`xmlStream.Position = 0;`或`xmlStream.Seek(0,SeekOrigin.Begin);`完成。由於在執行此操作後,監視的表達式不會自動更新,因此我建議從立即窗口執行這兩個命令。 – 2013-05-09 13:09:09

0

好的,我沒有成功地使用調試器而不修改代碼。我在下面的代碼片段中添加了一個代碼,它可以讓我在斷點中使用或使用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對象,即使它破壞執行流程,但在此期間,這是我所管理的最好的。