C # - от NetworkStream до XElement, управляющего различной кодировкой - PullRequest
0 голосов
/ 22 марта 2011

У меня есть приложение, которое ищет XML по сети (используя TcpClient), эти XML имеют различную кодировку (один сайт в UTF8, другой в Windows-1252).Я хотел бы закодировать все эти XML в UTF-8 (всегда), чтобы быть уверенным, что я чист.

Как я могу выполнить преобразование из NetworkStream в XElement, кодирующий все данные правильно?

У меня есть это:

NetworkStream _clientStream = /* ... */;
MemoryStream _responseBytes = new MemoryStream();

// serverEncoding -> Xml Encoding I get from server
// _UTF8Encoder -> Local encoder (always UTF8)

try
{
    _clientStream.CopyTo(_responseBytes);

    if (serverEncoding != _UTF8Encoder)
    {
        MemoryStream encodedStream = new MemoryStream();
        string line = null;
        using (StreamReader reader = new StreamReader(_responseBytes))
        {
            using (StreamWriter writer = new StreamWriter(encodedStream))
            {
                while ((line = reader.ReadLine()) != null)
                {
                    writer.WriteLine(
                        Encoding.Convert(serverEncoding, _UTF8Encoder, serverEncoding.GetBytes(line))
                        );
                }
            }
        }
        _responseBytes = encodedStream;
    }

    _responseBytes.Position = 0;
    using (XmlReader reader = XmlReader.Create(_responseBytes))
    {
        xmlResult = XElement.Load(reader, LoadOptions.PreserveWhitespace);
    }
}
catch (Exception ex)
{ }

Есть ли у вас лучшее решение (и игнорируя все '\ 0'?).


Редактировать

Этоработает:

byte[] b = _clientStream.ReadToEnd();
var text = _UTF8Encoder.GetString(b, 0, b.Length);
xmlResult = XElement.Parse(text, LoadOptions.PreserveWhitespace);

Но это не так:

using (var reader = new StreamReader(_clientStream, false))
    xmlResult = XElement.Load(reader, LoadOptions.PreserveWhitespace);

Я не понимаю, почему ...

1 Ответ

2 голосов
/ 22 марта 2011

Вы можете просто создать StreamReader вокруг NetworkStream, передав кодировку потока, а затем передать его XElement.Load:

XElement elem
using(var reader = new StreamReader = new StreamReader(_clientStream, serverEncoding))
    elem = XElement.Load(reader);

Нет смысла перекодировать его вручную вдругая кодировка.

...