загрузить XML -> прочитать поток Unicode и преобразовать его - PullRequest
3 голосов
/ 21 октября 2011

У меня есть элемент управления загрузкой файлов, куда я могу загружать XML-документы.

XML-файлы будут закодированы в формате Unicode. Я хочу преобразовать их в UTF8, чтобы они могли отображаться как правильный XML-файл.

Я сохраняю загруженный файл в скрытом поле в виде шестнадцатеричной строки и отправляю его универсальному обработчику. То, что я хочу, это результат, из которого я могу создать XML. На данный момент моя строка выглядит так:

"??<\0?\0x\0m\0l\0 \0v\0e\0r\0s\0i\0o\0n\0=\0\"\01\0.\00\0\"\0 \0e\0n\0c\0o\0d\0i\0n\0g\0=\0\"\0I\0S\0O\0-

Вместо

<?xml version="1.0".. etc

Код:

if (fileUpload.PostedFile.ContentType == "text/xml")
{
      Stream inputstream = fileUpload.PostedFile.InputStream;

      byte[] streamAsBytes = (ConvertStreamToByteArray(inputstream));

      string stringToSend = BitConverter.ToString(streamAsBytes);

      xmlstream.Value = stringToSend;

      sendXML.Visible = true;
      infoLabel.Text = "<b>Selected XML: </b>" + fileUpload.PostedFile.FileName;
}

handler.ashx:

if (HttpContext.Current.Request.Form["xmldata"] != null)
        {
            HttpContext.Current.Response.ContentType = "text/xml";
            HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;

            string xmlstring = HttpContext.Current.Request.Form["xmldata"];

            byte[] data = xmlstring.Split('-').Select(b => Convert.ToByte(b, 16)).ToArray();

            string complete = System.Text.ASCIIEncoding.ASCII.GetString(data);

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(complete);

            HttpContext.Current.Response.Write(doc.InnerXml);
        }

Спасибо!

1 Ответ

3 голосов
/ 21 октября 2011

Не совсем понятно, что вы действительно должны сделать это. XML-файлы могут объявлять свою собственную кодировку, и, похоже, ваша декларация объявляет кодировку, начинающуюся с «ISO» (на этом данные, которые вы нам предоставили, останавливаются). Это вероятно не UTF-8.

По сути, я не думаю, что вы должны воспринимать данные как текст в handler.ashx. Просто получите XmlDocument, чтобы разобрать его из потока. Не совсем ясно точно как ваш код загрузки отправляет данные, но вы должны постараться как можно меньше возиться с этим.

возможно , что ваш текущий код будет работать нормально, если вы просто измените это:

string complete = System.Text.ASCIIEncoding.ASCII.GetString(data);
XmlDocument doc = new XmlDocument();
doc.LoadXml(complete);

к этому:

XmlDocument doc = new XmlDocument();
doc.Load(new MemoryStream(data));

Тем не менее, шестнадцатеричная часть довольно некрасива. Если вам действительно нужно представить двоичные данные в виде текста, я настоятельно рекомендую использовать Base64 вместо hex:

string text = Convert.ToBase64String(binary);
...
byte[] binary = Convert.FromBase64String(text);

... нет необходимости преобразовывать каждый байт отдельно и разбивать строку на дефисы и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...