2009-05-06 2 views
11

Мне нужно отредактировать таблицу стилей XSLT, но я летел слепой, потому что XML-вход существует только мгновенно в связке потоков. Я могу отлаживать код, но не могу понять, как получить содержимое потоков в текст, на который я могу смотреть (и запускать XSLT вручную, пока я их редактирую).Как проверить потоки XML из отладчика в Visual Studio 2003

Код является частью большой старой унаследованной системы, я могу изменить ее в среде отладки, если это абсолютно необходимо, но она работает в службе Windows, соединенной с кучей MSMQ. Поэтому по разным причинам я предпочел бы использовать отладчик для просмотра 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 (как и я), пожалуйста, также помните, что вам может потребоваться сбросить указатель потока до начала, если он уже был прочитан. Это можно сделать, используя 'xmlStream.Position = 0;' или 'xmlStream.Seek (0, SeekOrigin.Begin);'. Поскольку наблюдаемое выражение не будет автоматически обновляться после этого, я бы рекомендовал выполнить обе команды из окна Immediate. –

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 в отладчик как-то, даже если это нарушает поток исполнения, но в то же время это лучшее, что я сумел.

Смежные вопросы