Domanda

Ho il seguente codice:

    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());

L'XML viene generato correttamente; Tuttavia, il mio problema è il primo carattere del 'test' stringa viene ï (char # 239), il che rende invalido ad alcuni parser XML: dov'è questo viene? Che cosa ci faccio in modo errato?

So di poter risolvere il problema da solo a partire dopo il primo carattere, ma preferirei so perché è lì che semplicemente l'applicazione di patch per il problema.

Grazie!

È stato utile?

Soluzione

Trovato una soluzione qui: http://www.timvw.be/generating-utf-8-with- systemxmlxmlwriter /

mi mancava questo in alto:

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

Grazie per l'aiuto a tutti!

Altri suggerimenti

Il problema è che il vostro l'XML generato dallo scrittore è UTF-16 durante l'utilizzo di UTF-8 per convertirlo in stringa. Prova a modificare:

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();

È possibile modificare le codifiche in questo modo:

w.Settings.Encoding = Encoding.UTF8;

Tutte queste sono un po 'fuori, se vi preoccupate per il marchio di ordine dei byte che è qualcosa redattori uso (ad esempio Visual Studio rilevare UTF8 XML codificato e l'evidenziazione della sintassi corretta).

Ecco una soluzione:

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();
}

Ho 2 frammenti in pieno qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top