加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:52:34 所属栏目:百科 来源:网络整理
导读:这是这样的情况: 我正在从XML API接收数据.此数据有时包含特殊的撇号字符,这会导致我的解析器崩溃.只有当我从本地文件中读取数据时才会发生此崩溃.当我从流中读取数据时没有崩溃,但我也没有得到DOM树:它退出而没有通知我. 您将在下面找到我们为使事情有效
这是这样的情况:

我正在从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:Testtest.xml");
var response = doc.InnerXml;
var tree = XDocument.Parse(response);

// Works
var xmlDoc = XDocument.Parse(File.ReadAllText("c:Testtest.xml",System.Text.Encoding.UTF8));
var xmlDoc = XDocument.Load("C:Testtest.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.无论如何,很高兴您的问题得到解决!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读