微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 尽管有编码,XML Parser仍然会遇到特殊字符

这是这样的情况:

我正在从XML API接收数据.此数据有时包含特殊的撇号字符,这会导致我的解析器崩溃.只有当我从本地文件中读取数据时才会发生此崩溃.当我从流中读取数据时没有崩溃,但我也没有得到DOM树:它退出而没有通知我.

您将在下面找到我们为使事情有效而进行的尝试列表:

// Does not work
var web = new WebClient();
web.Encoding = Encoding.UTF8;
var response = web.DownloadString("http://thetvdb.com/api/apikey/series/" + show.TVDBID + "/");
var tree = XDocument.Parse(response);

// Works
var doc = new XmlDocument();
doc.Load("C:\\Test\\test.xml");
var response = doc.InnerXml;
var tree = XDocument.Parse(response);

// Works
var xmlDoc = XDocument.Parse(File.ReadAllText("c:\\Test\\test.xml",System.Text.Encoding.UTF8));
var xmlDoc = XDocument.Load("C:\\Test\\test.xml");
var tree = xmlDoc;

// Does not work
var web = new WebClient();
web.Encoding = Encoding.UTF8;
web.DownloadFile("http://thetvdb.com/api/apikey/series/" + show.TVDBID + "/","C:\\test.xml");
var tree = XDocument.Load("C:\\test.xml");

// Does not work
var web = new WebClient();
web.Encoding = Encoding.UTF8;
var data = web.DownloadData("http://thetvdb.com/api/apikey/series/" + show.TVDBID + "/");
var response = Encoding.UTF8.GetString(data);
var tree = XDocument.Parse(response);

我确定某些东西是否有效取决于它是否到达此循环的第一行中的断点:

if (root != null) { 
     var lastupdate = root.Element("Series").Element("lastupdated").Value;

     foreach (var epi in tree.Descendants("Episode")) {
          var season = epi.Element("SeasonNumber").Value; // Breakpoint here
     }
}

当解析器遇到这个撇号时发生崩溃:

当我用我自己手动输入的撇号或&#39替换这个字符时,不会再抛出错误并继续下一个.
当我在firefox和chrome中查看API请求的源页面时,它告诉我编码是UTF-8,API维基上的代码示例也在标题显示UTF-8.

这是我到目前为止的地方.有任何想法吗?

我刚刚发现API查询中的结果字符串只包含< Series>< / Series>在调试期间根据XML / Text / HTML可视化工具进行标记,并且没有< Episode>< / Episode>那些.但是,当我在浏览器中执行相同的查询时,它会向我显示两者.这可能吗?当我通过Postman看它时,它显示了剧集.

更新:

当我使用Unicode作为编码时,我没有收到任何警告,我可以完全解析本地xml文件!我不是编码专家,使用Unicode有什么缺点吗?

当使用unicode进行数据流时,我得到了一堆亚洲字符.

解决方法

它与数据的编码有关.这允许您获得原始二进制(因此编码没有问题).

WebClient myWebClient = new WebClient();
byte[] data = myWebClient.DownloadData(uri);

string xmlContents = Encoding.UTF8.GetString(data);

编辑根据你最近的Unicode开发,我会说数据实际上是用UTF-16编码的. Unicode不是一种编码类型,它本质上只是一个编码字符集 – 即一组字符和字符与表示它们的整数代码点之间的映射.当你“用Unicode编码某些东西”时,它通常意味着UTF-16.无论如何,很高兴您的问题得到解决

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐