上传XML - >读取unicode流并转换它

时间:2011-10-21 09:51:15

标签: c# asp.net xml encoding

我有一个文件上传控件,可以上传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 个答案:

答案 0 :(得分:3)

你真的应该这样做并不清楚。 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);

...不需要单独转换每个字节并将字符串拆分为连字符等。