загрузить XML -> прочитать поток unicode и преобразовать его

#c# #asp.net #xml #encoding

#c# #asp.net #xml #кодирование

Вопрос:

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

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

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

 "??<?xml version="1.0" encoding="ISO-
 

Вместо

 <?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:

Совсем не ясно, что вы действительно должны это делать. 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);
 

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

Комментарии:

1. Хорошо, спасибо за информацию. Не могли бы вы рассказать мне, как преобразовать поток в текстовую строку? Я пытался использовать StreamReader, но не смог заставить его работать. Спасибо. Кстати; я все еще сталкиваюсь с той же проблемой с приведенным выше кодом:/ Что касается тега кодирования xml, я просто забыл его изменить. Я генерирую файлы, поэтому я знаю, что они всегда будут одинаковыми.

2. @Johan: Почему ты хочешь это сделать? Откуда вы получаете поток? Какой текст вы хотите, чтобы он был? Например, чтобы сохранить байты, вы должны в основном преобразовать его в массив байтов, а затем использовать Convert.ToBase64String .

3. Основная идея состоит в том, чтобы загрузить XML-файл без его сохранения -> прочитать поток -> сохранить поток временно в скрытом поле в виде строкового формата -> отправить содержимое скрытого поля с помощью jquery ajax обработчику -> обработчик преобразует его в XML и генерирует в качестве ответа

4. @Johan: Хорошо, итак, считайте поток в массив байтов, преобразуйте в текст, используя Convert.ToBase64String , передайте на сервер, преобразуйте обратно в двоичный файл, используя Convert.FromBase64String , чтобы получить байты, оберните их в a MemoryStream , проанализируйте XML из этого.

5. Хорошо, я попробую это. Спасибо за вашу помощь, Джон