2009-05-14 8 views
6

Tôi có đoạn mã sau:mã hóa XmlWriter

MemoryStream ms = new MemoryStream(); 
    XmlWriter w = XmlWriter.Create(ms); 

    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
    w.Close(); 
    ms.Close(); 

    string test = UTF8Encoding.UTF8.GetString(ms.ToArray()); 

XML được tạo ra một cách chính xác; tuy nhiên, vấn đề của tôi là ký tự đầu tiên của chuỗi 'test' là ï (char # 239), làm cho nó không hợp lệ đối với một số trình phân tích cú pháp xml: nó đến từ đâu? Chính xác thì tôi đang làm gì sai?

Tôi biết tôi có thể giải quyết vấn đề này bằng cách chỉ bắt đầu sau ký tự đầu tiên, nhưng tôi muốn biết tại sao nó lại đơn giản là vá lỗi.

Cảm ơn!

Trả lời

13

Tìm thấy một giải pháp ở đây: http://www.timvw.be/generating-utf-8-with-systemxmlxmlwriter/

Tôi đã mất tích này ở đầu trang:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); 
xmlWriterSettings.Encoding = new UTF8Encoding(false); 
MemoryStream ms = new MemoryStream(); 
XmlWriter w = XmlWriter.Create(ms, xmlWriterSettings); 

Thanks for the help tất cả mọi người!

+2

+1 BOM đã nhận được tôi một lần nữa. cảm ơn. – bendewey

+0

BOM giúp tôi mỗi lần ... Encoding.UTF8 mặc định bao gồm BOM. –

0

Bạn có thể thay đổi mã hóa như thế này:

w.Settings.Encoding = Encoding.UTF8; 
+0

.Settings.Encoding là readonly; Tôi không tin rằng sẽ làm việc – John

+0

Bạn có chắc chắn? Nhìn vào MSDN tài sản hỗ trợ cả hai nhận được/thiết lập nhưng tôi đã không thử nó Tôi chỉ biết nó có:/ – Lloyd

+0

Yep. nó cho phép bạn thiết lập nó; tuy nhiên, nó sẽ dẫn đến một lỗi thời gian chạy (không phải lỗi biên dịch) – John

2

Vấn đề là bạn XML tạo ra bởi các nhà văn là UTF- 16 trong khi bạn sử dụng UTF-8 để chuyển đổi nó thành chuỗi. Hãy thử điều này thay vì:

StringBuilder sb = new StringBuilder(); 
using (StringWriter writer = new StringWriter(sb)) 
using (XmlWriter w = XmlWriter.Create(writer)) 
{ 
    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
} 

string test = sb.ToString(); 
+0

Lý do cho UTF-8 là nhận được xmlwriter cho đầu ra 'encoding = utf8' – John

0

Tất cả những điều này hơi tắt, nếu bạn quan tâm đến dấu thứ tự byte mà trình chỉnh sửa sử dụng (chẳng hạn như Visual Studio phát hiện mã hóa UTF8 XML và đánh dấu cú pháp đúng cách).

Dưới đây là một giải pháp:

MemoryStream stream = new MemoryStream(); 

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = Encoding.UTF8; 
settings.Indent = true; 
settings.IndentChars = "\t"; 

using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
{ 
    // ... write 

    // Make sure you flush or you only get half the text 
    writer.Flush(); 

    // Use a StreamReader to get the byte order correct 
    StreamReader reader = new StreamReader(stream,Encoding.UTF8,true); 
    stream.Seek(0, SeekOrigin.Begin); 
    result = reader.ReadToEnd(); 
} 

Tôi đã có 2 đoạn mã được đầy đủ here