2009-05-06 32 views
11

Tôi phải chỉnh sửa biểu định kiểu XSLT, nhưng tôi bị mù do đầu vào XML chỉ tồn tại trong một loạt các luồng. Tôi có thể gỡ lỗi vào mã, nhưng không thể tìm ra cách lấy nội dung của các luồng ra thành văn bản mà tôi có thể xem (và chạy qua XSLT theo cách thủ công trong khi tôi đang chỉnh sửa chúng).Cách kiểm tra luồng XML từ trình gỡ rối trong Visual Studio 2003

Mã này là một phần của hệ thống cũ cũ, tôi có thể sửa đổi nó trong môi trường gỡ lỗi nếu cần thiết, nhưng nó chạy trong dịch vụ windows được kết nối với một loạt MSMQ. Vì vậy, vì nhiều lý do tôi muốn có thể sử dụng trình gỡ rối để xem XML mà không phải thay đổi mã đầu tiên.

Mã nhiều đơn giản, là một cái gì đó như thế này: (C# - nhưng hãy nhớ nó .net 1.1 trong VS 2003.)

Đây là chức năng mà được XML như một dòng suối, sau đó được đưa vào một số loại đối tượng chuyển đổi XSLT. Tôi đã thử nhìn vào các đối tượng writer và xmlStream trong các cửa sổ đồng hồ và cửa sổ ngay lập tức, nhưng không thể hiểu rõ cách xem XML thực tế.

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! 
} 

Tất cả trợ giúp được đánh giá cao.

Trả lời

14

Bạn chỉ có thể thêm biểu hiện này để cửa sổ đồng hồ của bạn sau khi MemoryStream is ready:

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

Xem biểu thức không cần phải là giá trị biến đơn giản. Chúng có thể là những biểu thức phức tạp, nhưng chúng sẽ có tác dụng phụ. Như bạn đã lưu ý, điều này sẽ làm gián đoạn việc thực thi vì nội dung luồng sẽ được đọc hoàn toàn. Bạn có thể tạo lại luồng sau khi gián đoạn bằng biểu thức khác, nếu bạn cần khởi động lại quá trình thực thi.

Tình huống này phát sinh thường xuyên khi gỡ lỗi mã bằng luồng, vì vậy tôi tránh chúng cho các tác vụ đơn giản, độc lập. Thật không may, đối với các hệ thống lớn, nó không phải luôn luôn dễ dàng để biết trước cho dù bạn nên làm cho mã của bạn theo định hướng hay không, vì nó phụ thuộc rất nhiều vào cách nó sẽ được sử dụng. Tuy nhiên, tôi cho rằng việc sử dụng các luồng là tối ưu hóa sớm trong nhiều trường hợp.

+2

Đối với bất kỳ ai truy cập câu trả lời này từ Google (như tôi đã làm), xin lưu ý rằng bạn có thể cần phải đặt lại con trỏ Luồng về đầu nếu nó đã được đọc từ đó. Điều này có thể được thực hiện bằng cách sử dụng 'xmlStream.Position = 0;' hoặc 'xmlStream.Seek (0, SeekOrigin.Begin);'. Vì biểu thức đã xem không tự động cập nhật sau khi thực hiện việc này, tôi khuyên bạn nên thực hiện cả hai lệnh từ Cửa sổ ngay lập tức. –

0

OK, tôi đã không thành công trong việc sử dụng trình gỡ rối mà không sửa đổi mã. Tôi đã thêm vào đoạn mã sau, cho phép tôi đặt điểm ngắt trong hoặc sử dụng 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! 
} 

tôi vẫn muốn để chỉ cần nhìn vào đối tượng xmlstream trong trình gỡ lỗi bằng cách nào đó, ngay cả khi nó phá vỡ các luồng thực hiện, nhưng trong thời gian này là tốt nhất mà tôi đã được quản lý.

Các vấn đề liên quan