Encoding '';,十六进制值0x1F是无效字符。第1行,位置1
我正在尝试从web读取xml文件,并使用XDocument解析它。它通常工作正常,但有时会给我一天的错误: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
**' ', 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文件中,并脱机进行调查
如果您计划简单地替换字符,但无法替换,因为您有一个流而不是文本,只需将流读入字符串,然后删除不需要的字符。如果您正在解码从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文件: