这是目前的情况:
我正在从 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
}
}
当解析器遇到这个撇号时会发生崩溃:
当我用我自己手动输入的撇号或用 替换这个字符时'
,不会再抛出错误,它会一直持续到下一个。当我在 firefox 和 chrome 中查看 API 请求的源页面时,它告诉我编码是 UTF-8,API wiki 上的代码示例也在标题中显示 UTF-8。
这是我到目前为止的地方。有任何想法吗?
我刚刚注意到,API 查询的结果字符串<Series></Series>
在调试期间仅包含一个根据 XML/Text/HTML 可视化工具的标记,而没有<Episode></Episode>
。但是,当我在浏览器中执行相同的查询时,它会显示两者。这可能吗?当我通过邮递员查看它时,它会显示剧集。
更新:
当我使用 Unicode 作为编码时,我没有收到任何警告,并且能够完全解析本地 xml 文件!我不是编码专家,使用 Unicode 有什么缺点吗?
当对数据流使用 unicode 时,我得到了一堆亚洲字符。