【问题标题】:' ', hexadecimal value 0x1F, is an invalid character. Line 1, position 1' ',十六进制值 0x1F,是无效字符。第 1 行,位置 1
【发布时间】:2011-10-07 09:14:46
【问题描述】:

我正在尝试从 Web 读取 xml 文件并使用 XDocument 将其解析出来。它通常工作正常,但有时它会给我一天的这个错误:

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

我尝试了 Google 的一些解决方案,但它们不适用于 VS 2010 Express 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=

【问题讨论】:

  • 能否请您也尝试发布 XML 内容?
  • 我试过这个但没有用,仍然报错: s = s.Replace(Convert.ToString((byte)0x1F), string.Empty); Stream str = new MemoryStream(UTF8Encoding.UTF8.GetBytes(s));
  • 这是我尝试读取的 xml 文件:music.mobion.vn/api/v1/music/userstop?devid=

标签: encoding linq-to-xml windows-phone


【解决方案1】:

如果您不显示相关信息,没有人可以回答 - 我是指 Xml 内容。

作为一般建议,我会在 ReadToEnd() 调用之后放置一个断点。现在你可以做几件事:

  • 向该论坛展示 Xml 内容。
  • 使用 VS Xml 可视化工具对其进行测试。
  • 将字符串复制粘贴到 txt 文件中并离线调查。

【讨论】:

    【解决方案2】:

    我猜这可能是一个编码问题,但没有看到 XML 我不能肯定地说。

    就您计划简单地替换字符但无法替换,因为您有一个流而不是文本,只需将流读入字符串,然后删除您不想要的字符。

    【讨论】:

      【解决方案3】:

      如果您正在解码从网络上读取的内容,请考虑使用 System.Web.HttpUtility.HtmlDecode

      【讨论】:

        【解决方案4】:

        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/

        【讨论】:

          【解决方案5】:

          如果您在替换角色时遇到问题

          对我来说,如果您尝试使用字符串而不是字符进行替换,则会出现一些问题。我建议使用两者来尝试一些测试值,看看它们会出现什么。你如何引用它也有一些影响。

          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

          【讨论】:

            【解决方案6】:

            我遇到了同样的问题,发现问题是嵌入在 xml 中的 。 解决方案是:

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

            【讨论】:

              【解决方案7】:

              为我工作.........

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

              【讨论】:

                【解决方案8】:

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

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

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

                使用“旧”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;
                    }
                }
                

                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);
                                }   
                            }
                        }
                    }
                }
                

                网络客户端

                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() 的好处,因为您正在使用流。

                【讨论】:

                • 您的 HttpClient 代码对我来说效果很好。谢谢
                【解决方案9】:

                我使用 XmlSerializer 解析 XML 并遇到同样的异常。 问题是 XML 字符串包含无效字符的 HTML 代码

                此方法从字符串中删除所有无效的 HTML 代码(基于此线程 - https://forums.asp.net/t/1483793.aspx?Need+a+method+that+removes+illegal+XML+characters+from+a+String):

                    public static string RemoveInvalidXmlSubstrs(string xmlStr)
                    {
                        string pattern = "&#((\\d+)|(x\\S+));";
                        Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
                        if (regex.IsMatch(xmlStr))
                        {
                            xmlStr = regex.Replace(xmlStr, new MatchEvaluator(m =>
                            {
                                string s = m.Value;
                                string unicodeNumStr = s.Substring(2, s.Length - 3);
                
                                int unicodeNum = unicodeNumStr.StartsWith("x") ?
                                Convert.ToInt32(unicodeNumStr.Substring(1), 16)
                                : Convert.ToInt32(unicodeNumStr);
                
                                //according to https://www.w3.org/TR/xml/#charsets
                                if ((unicodeNum == 0x9 || unicodeNum == 0xA || unicodeNum == 0xD) ||
                                ((unicodeNum >= 0x20) && (unicodeNum <= 0xD7FF)) ||
                                ((unicodeNum >= 0xE000) && (unicodeNum <= 0xFFFD)) ||
                                ((unicodeNum >= 0x10000) && (unicodeNum <= 0x10FFFF)))
                                {
                                    return s;
                                }
                                else
                                {
                                    return String.Empty;
                                }
                            })
                            );
                        }
                        return xmlStr;
                    }
                

                【讨论】:

                  猜你喜欢
                  • 2015-06-23
                  • 1970-01-01
                  • 2020-12-15
                  • 2014-08-16
                  • 2021-08-07
                  • 2012-05-17
                  • 2012-06-17
                  • 2016-11-14
                  • 2016-03-30
                  相关资源
                  最近更新 更多