Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encoding '';,十六进制值0x1F是无效字符。第1行,位置1_Encoding_Linq To Xml_Windows Phone - Fatal编程技术网

Encoding '';,十六进制值0x1F是无效字符。第1行,位置1

Encoding '';,十六进制值0x1F是无效字符。第1行,位置1,encoding,linq-to-xml,windows-phone,Encoding,Linq To Xml,Windows Phone,我正在尝试从web读取xml文件,并使用XDocument解析它。它通常工作正常,但有时会给我一天的错误: **' ', hexadecimal value 0x1F, is an invalid character. Line 1, position 1** 我尝试过谷歌的一些解决方案,但它们不适用于VS 2010 Express Windows Phone 7 有一种解决方案可以将0x1F字符替换为string.empty,但我的代码返回一个没有replace方法的流 s = s.Rep

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

 **' ', hexadecimal value 0x1F, is an invalid character. Line 1, position 1**
我尝试过谷歌的一些解决方案,但它们不适用于VS 2010 Express Windows Phone 7

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

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文件:

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

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

  • 向本论坛展示Xml内容
  • 使用VSXML可视化工具测试它
  • 将字符串复制粘贴到txt文件中,并脱机进行调查

我想这可能是一个编码问题,但在没有看到XML的情况下,我无法确定


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

如果您正在解码从web读取的内容,请考虑使用。

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中的非法字符-很可能还有其他字符


如果您在替换字符时遇到问题

对我来说,如果尝试使用字符串而不是字符替换,则会出现一些问题。我建议尝试使用这两种方法测试一些值,看看它们会出现什么结果。你引用它的方式也有一些影响

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

我也有同样的问题,发现问题出在a
&31嵌入到xml中。
解决办法是:

s = s.Replace("", " ")
为我工作

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

可能发生的情况是内容被压缩了,在这种情况下,您需要对其进行解压缩

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

要使用这两种方法,您可以执行以下操作:

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);
            }
        }
    }
}
网络客户端

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

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

此方法从字符串中删除所有无效的HTML代码(基于此线程-):

公共静态字符串RemoveInvalidXmlSubstrs(字符串xmlStr)
{
字符串模式=“&#((\\d+)|(x\\S+)”;
Regex Regex=new Regex(模式,RegexOptions.IgnoreCase);
if(regex.IsMatch(xmlStr))
{
xmlStr=regex.Replace(xmlStr,新的MatchEvaluator(m=>
{
字符串s=m.值;
字符串unicodeNumStr=s.Substring(2,s.Length-3);
int unicodeNum=unicodeNumStr.StartsWith(“x”)?
转换为32(unicodeNumStr.子字符串(1),16)
:Convert.ToInt32(unicodeNumStr);
//据https://www.w3.org/TR/xml/#charsets
如果((单密度==0x9 | |单密度==0xA | |单密度==0xD)||

((unicodeNum>=0x20)和&(unicodeNum=0xE000)和&(unicodeNum=0x10000)和&(unicodeNum)您可以尝试发布XML内容吗?我已经尝试过了,但没有成功,仍然给出了错误:s=s.Replace(Convert.ToString((byte)0x1F),string.Empty);Stream=new MemoryStream(UTF8Encoding.UTF8.GetBytes(s));以下是我试图读取的xml文件: