'',十六进制值0x1F,是无效字符.第1行,第1位

Ngh*_*yen 15 encoding linq-to-xml windows-phone

我试图从Web读取一个xml文件,并使用XDocument解析它.它通常工作正常,但有时它给我这一天的错误:

 **' ', hexadecimal value 0x1F, is an invalid character. Line 1, position 1**
Run Code Online (Sandbox Code Playgroud)

我尝试了一些谷歌的解决方案,但他们不适用于VS 2010 Express Windows Phone 7.

有一个解决方案将0x1F字符替换为string.empty,但我的代码返回一个没有replace方法的流.

s = s.Replace(Convert.ToString((byte)0x1F), string.Empty);
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

        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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

XML文件:http: //music.mobion.vn/api/v1/music/userstop?devid =

Reb*_*cca 17

0x1f是Windows控件字符.它不是有效的XML.你最好的选择是更换它.

而不是使用reader.ReadToEnd()(顺便说一句 - 对于一个大文件 - 可以消耗大量的内存..虽然你绝对可以使用它)为什么不尝试类似的东西:

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

如果您愿意,可以重新转换为流,然后随意使用.

byte[] byteArray = Encoding.ASCII.GetBytes( input );
MemoryStream stream = new MemoryStream( byteArray );
Run Code Online (Sandbox Code Playgroud)

或者你可以继续执行readToEnd()然后清理那个非法字符串,然后转换回流.

这是清理xml中非法字符的好资源 - 很有可能,你也有其他人...

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


Jim*_*lff 6

可能发生的情况是内容被压缩,在这种情况下您需要解压缩它。

使用 HttpHandler 您可以通过以下方式执行此操作:

var client = new HttpClient(new HttpClientHandler
{
    AutomaticDecompression = DecompressionMethods.GZip
                             | DecompressionMethods.Deflate
});
Run Code Online (Sandbox Code Playgroud)

使用“旧”WebClient,您必须派生自己的类才能达到类似的效果:

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

以上取自这里

要使用这两个,您将执行以下操作:

客户端

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);
                }   
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

网络客户端

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您还可以获得不必 .ReadToEnd() 的好处,因为您正在使用流。


Cla*_*sen 4

如果您要解码从 Web 读取的内容,请考虑使用System.Web.HttpUtility.HtmlDecode 。