2011-07-18 429 views
15

我想從網上讀取一個xml文件並使用XDocument解析出來。它通常工作正常,但有時它給我這個錯誤的一天:'',十六進制值0x1F,是一個無效的字符。第1行,位置1

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

我試圖從谷歌的一些解決方案,但他們沒有對VS 2010速成的Windows Phone 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); Stream str = new MemoryStream(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。你最好的選擇是替換它。

而不是使用reader.ReadToEnd()的(其中的方式 - 一個大文件 - 最多可以使用大量的內存..但你絕對可以使用它)爲什麼不嘗試這樣的:

string input; 
while ((input = sr.ReadLine()) != null) 
{ 
    string = string + input.Replace((char)(0x1F), ' '); 
} 

如果您願意,您可以重新轉換爲流,然後按照您的要求使用。

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

可能是什麼情況是,內容壓縮在你需要解壓這種情況下它。

隨着HttpHandler的,你可以做到這一點通過以下方式:

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

與「老」 Web客戶端,你必須派生自己的類來實現同樣的效果:

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

要使用這兩個你會做這樣的事情:

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(),因爲你是隨大流的工作,而不是利益。

相關問題