2011-07-18 101 views
15

WebからXMLファイルを読み込み、XDocumentを使って解析しようとしています。これは、通常は正常に動作しますが、時にはそれが私の一日のために、このエラーを与える:''、16進値0x1Fは無効な文字です。 1行目、1行目

**' ', hexadecimal value 0x1F, is an invalid character. Line 1, position 1** 

私はGoogleからのいくつかのソリューションを試みたが、彼らはVS 2010 ExpressのWindowsの携帯電話のための7

を働いていない解決策がありますこれは0x1F文字をstring.emptyに置き換えますが、私のコードは、置換メソッドを持たないストリームを返します。ここで

s = s.Replace(Convert.ToString((byte)0x1F), string.Empty); 

私のコードです:

 void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     using (var reader = new StreamReader(e.Result)) 
     { 
      int[] counter = { 1 }; 
      string s = reader.ReadToEnd(); 
      Stream str = e.Result; 
     //  s = s.Replace(Convert.ToString((byte)0x1F), string.Empty); 
    //  byte[] str = Convert.FromBase64String(s); 
    //  Stream memStream = new MemoryStream(str); 
      str.Position = 0; 
      XDocument xdoc = XDocument.Load(str);     

      var data = from query in xdoc.Descendants("user") 
         select new mobion 
         { 
          index = counter[0]++, 
          avlink = (string)query.Element("user_info").Element("avlink"), 
          nickname = (string)query.Element("user_info").Element("nickname"), 
          track = (string)query.Element("track"), 
          artist = (string)query.Element("artist"), 
         }; 
      listBox.ItemsSource = data; 
     } 
    } 

XMLファイル:あなたは、関連する情報を表示しない場合 http://music.mobion.vn/api/v1/music/userstop?devid=

+1

XMLコンテンツも投稿してみてください。 –

+0

私はこれを試しましたが、うまくいかず、まだエラーが出ています: s = s.Replace(Convert.ToString((byte)0x1F)、string.Empty); ストリームstr =新しいメモリストリーム(UTF8Encoding.UTF8.GetBytes(s)); –

+0

ここには私が読むことを試みるxmlファイルがあります: http://music.mobion.vn/api/v1/music/userstop?devid= –

答えて

-1

誰も答えることはできません - 私は、XMLコンテンツを意味します。

一般的なアドバイスとして、私はReadToEnd()呼び出しの後にブレークポイントを設定します。今、あなたはいくつかのことをすることができます:

  • このフォーラムにXmlコンテンツを公開してください。
  • VS Xmlビジュアライザーを使用してテストします。
  • 文字列をtxtファイルにコピー&ペーストし、オフラインで調査します。
0

おそらくエンコードの問題だと思いますが、XMLを見ることなく、私は確かに言うことはできません。

単純に文字を置き換えることはできますができないという点では、テキストではなくストリームがあるため、ストリームを文字列に読み込んで不要な文字を削除するだけです。

16

0x1fはWindowsの制御文字です。これは有効なXMLではありません。あなたの最善の策はそれを置き換えることです。

string input; 
while ((input = sr.ReadLine()) != null) 
{ 
    string = string + input.Replace((char)(0x1F), ' '); 
} 
:なぜような何かをしようとしない(あなたは間違いなくそれを使うことができますが、多くのメモリ..を使用することができます - - 大きなファイルのための方法で)代わりにreader.ReadToEnd()を使用しての

ストリームに変換し直すことができます。希望どおりに使用してください。

byte[] byteArray = Encoding.ASCII.GetBytes(input); 
MemoryStream stream = new MemoryStream(byteArray); 

さもないと、あなたはreadToEnd()をやり続ける、その後、不正な文字の文字列をきれいにし、ストリームに戻って変換することができます。

ここでは、あなたのXMLで違法な文字を掃除するための良いリソースはありますか?

https://seattlesoftware.wordpress.com/tag/hexadecimal-value-0x-is-an-invalid-character/

3

あなたは、文字列の代わりの文字を使用して置き換えるしようとすると、いくつかの問題があった私にとっては、文字

を交換する問題が発生している場合。私は両者を使っていくつかのテスト値を試してみて、彼らが何を見るかを見てみることをお勧めしますそれを参照する方法にもいくつかの効果があります。

var a = x.IndexOf('\u001f');      // 513 
var b = x.IndexOf(Convert.ToString((byte)0x1F)); // -1 
x = x.Replace(Convert.ToChar((byte)0x1F), ' '); // Works 
x = x.Replace(Convert.ToString((byte)0x1F), " "); // Fails 

I blagged this

1

私は同じ問題を持っていた問題は、XMLに埋め込まれであることがわかりました。 解決策だった:私と一緒に

s = s.Replace("", " ") 
0

作品.........起こって何ができるか

string.Replace(Chr(31), "") 
3

コンテンツは、あなたが解凍する必要がある場合には圧縮であるということですそれ。

class MyWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest; 
     request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
     return request; 
    } 
} 

Above taken from here

:あなたが同様の効果を達成するために、独自のクラスを派生しなければならない「古い」Webクライアントで

var client = new HttpClient(new HttpClientHandler 
{ 
    AutomaticDecompression = DecompressionMethods.GZip 
          | DecompressionMethods.Deflate 
}); 

:あなたはこの次の方法を行うことができますのHttpHandlerで

2つを使用する場合は、次のようにします。

HttpClientを

using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })) 
{ 
    using (var stream = client.GetStreamAsync(url)) 
    { 
     using (var sr = new StreamReader(stream.Result)) 
     { 
      using (var reader = XmlReader.Create(sr)) 
      { 
       var feed = System.ServiceModel.Syndication.SyndicationFeed.Load(reader); 
       foreach (var item in feed.Items) 
       { 
        Console.WriteLine(item.Title.Text); 
       } 
      } 
     } 
    } 
} 

のWebClient

using (var stream = new MyWebClient().OpenRead("http://myrss.url")) 
{ 
    using (var sr = new StreamReader(stream)) 
    { 
     using (var reader = XmlReader.Create(sr)) 
     { 
      var feed = System.ServiceModel.Syndication.SyndicationFeed.Load(reader); 
      foreach (var item in feed.Items) 
      { 
       Console.WriteLine(item.Title.Text); 
      } 
     } 
    } 
} 

あなたもあなたの代わりに、ストリームで作業しているので、.ReadToEnd()を持っていないの利点を受け取るこの方法です。

関連する問題