2010-04-09 35 views
5

Cho một cá thể XDocument, làm thế nào tôi có thể dễ dàng có được một TextReader đại diện cho trường hợp đó?Làm thế nào tôi có thể dễ dàng có được một TextReader từ một XDocument?

Điều tốt nhất tôi đã có thể đưa ra là một cái gì đó như thế này (nơi xml là một ví dụ XDocument):

var s = new MemoryStream(); 
var sw = new StreamWriter(s); 

xml.Save(sw); 

sw.Flush(); 
s.Position = 0; 

TextReader tr = new StreamReader(s); 

Tuy nhiên, điều này dường như một chút phiền phức, vì vậy tôi đã tự hỏi nếu có một cách dễ dàng hơn?


Sửa

Ví dụ trên là tương đương với việc chuyển đổi toàn bộ dụ cho một chuỗi XML và sau đó tạo ra một TextReader trên chuỗi đó.

Tôi đã tự hỏi liệu có cách nào giống như luồng hơn để làm điều đó hơn là đọc toàn bộ nội dung vào bộ nhớ.

+0

Đánh dấu - chỉ xảy ra với tôi rằng đôi khi tôi sử dụng "biến tần" cho các trường hợp một số API muốn ghi vào luồng và tôi cần đọc từ đó (ví dụ: đối với ActionResult). Điều này có thể được điều chỉnh để tạo ra một "bộ biến đổi văn bản", mà về cơ bản sẽ cung cấp cho bạn truy cập được truyền trực tiếp thông qua 'XDocument.Save', nhưng nhược điểm là nó yêu cầu một chuỗi phụ để chạy. Điều đó có giúp bạn ở đây không? – Aaronaught

+0

@Aaronaught: Cảm ơn, nhưng đó có thể là quá nhiều để làm cho nó. Tôi chủ yếu đặt câu hỏi ra khỏi tò mò. Trong vấn đề hiện tại của tôi, tôi hy vọng sẽ phân tích cú pháp một đoạn XML nhỏ khi khởi động ứng dụng, vì vậy tôi chắc chắn có thể sống với tải toàn bộ tài liệu cùng một lúc. –

+0

Được rồi, tôi đoán bạn đã cố gắng gửi nó qua mạng hoặc một thứ gì đó có hiệu lực. Tôi tò mò tại sao bạn cần phải làm điều này sau đó, bạn đang sử dụng một API XML mà chỉ có thể chấp nhận một 'TextReader'? – Aaronaught

Trả lời

3
TextReader tr = new StringReader(xml.ToString()); 

Kindness,

Dan

+0

Vâng, đó chắc chắn là tốt hơn so với cách tiếp cận ban đầu của tôi, nhưng vẫn không thực sự những gì tôi đang tìm kiếm (xem câu hỏi đã chỉnh sửa của tôi). Tuy nhiên, +1 một cho tôi một thay thế một dòng :) –

+0

Tôi có lẽ sẽ thêm rằng gọi 'TextReader' nên được gói với' using' vì nó thực hiện 'IDisposable'. –

0

Tôi đã không thử nó, nhưng có một phương pháp XNode.WriteTo(XmlWriter). Bạn có thể vượt qua nó XmlTextWriter để có được một đại diện văn bản. Điều này có lẽ sẽ mất hơi nhiều mã để viết, nhưng nó phải là nhiều "dòng giống" như bạn yêu cầu :-)

[Edit:] Thậm chí dễ dàng hơn: Có một phương pháp XNode.CreateReader() mang đến cho bạn một XmlReader. Bạn sẽ chỉ phải xử lý việc chuyển đổi thành văn bản.

+0

Có, nhưng đó là chà. Trừ khi tôi đang thiếu một cái gì đó, không có chuyển đổi dễ dàng từ XmlReader sang TextReader. –

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