2011-10-21 4 views
3

xmlドキュメントをアップロードできるファイルアップロードコントロールがあります。アップロードXML - >ユニコードストリームを読み込んでそれを変換する

XMLファイルは、Unicode形式でエンコードされます。私はそれらをUTF8に変換したいので、適切なxmlファイルとしてレンダリングすることができます。

アップロードされたファイルを非表示フィールドに16進数の文字列として保存し、ジェネリックハンドラに送信します。私が望むのは、私がXMLを作成できるという結果です。

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 version="1.0".. etc 

コードの

"??<\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- 

:現時点では私の文字列は次のようになります!

答えて

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を使用してお勧めします:

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

...別に各バイトを変換する必要はありませんし、ハイフンで文字列を分割など

+0

入力いただきありがとうございます。ストリームをテキスト文字列に変換する方法を教えてください。私はStreamReaderで試しましたが、うまく動作しませんでした。ありがとう。 Btw;私はまだ上記のコードで同じ問題が発生します:/限り、XMLエンコーディングタグに関する限り、私はそれを変更することを忘れてしまった。私はファイルを生成するので、常に同じであることがわかります。 – Johan

+0

@Johan:なぜあなたはそれをしたいですか?ストリームはどこにありますか?あなたはどんな種類のテキストを好きですか?たとえば、バイトを保存するには、基本的にはバイト配列に変換し、 'Convert.ToBase64String'を使用する必要があります。 –

+0

基本的な考え方は、XMLファイルを保存せずにアップロードすることです。>ストリームを読み込みます。>ストリームを一時的に隠しフィールドに文字列形式で保存します。> jquery ajaxを使用してhiddenfieldのコンテンツをハンドラに送ります。 XMLを作成し、それをレスポンスとして生成します。 – Johan

関連する問題