上传XML ->读取unicode流并转换它
本文关键字:转换 unicode 读取 XML 上传 | 更新日期: 2023-09-27 18:12:02
我有一个fileupload控件,我可以上传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);
}
谢谢!
您是否真的应该这样做一点都不清楚。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而不是十六进制:
string text = Convert.ToBase64String(binary);
...
byte[] binary = Convert.FromBase64String(text);
…不需要单独转换每个字节,也不需要用连字符等分割字符串