#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
, чтобы получить байты, оберните их в aMemoryStream
, проанализируйте XML из этого.5. Хорошо, я попробую это. Спасибо за вашу помощь, Джон