4

これはそのままの状況です:

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 wiki のコード例でもヘッダーに UTF-8 が表示されていることがわかります。

これが私がこれまでのところです。何か案は?

<Series></Series>API クエリからの結果文字列には、デバッグ中に XML/Text/HTML ビジュアライザーによるタグのみが含まれており、何も含まれていないことに気付き<Episode></Episode>ました。ただし、ブラウザで同じクエリを実行すると、両方が表示されます。これは可能ですか?Postman を通して見ると、エピソードが表示されます。

アップデート:

エンコーディングとして Unicode を使用すると、警告は表示されず、ローカルの xml ファイルを完全に解析できます。私はエンコーディングの専門家ではありませんが、Unicode を使用することの欠点はありますか?

データのストリームに Unicode を使用すると、アジアの文字が大量に表示されます。

4

4 に答える 4

0

&#39特定のブラウザの html エスケープです。代わりに使用してください&apos;。これは正しい xml エスケープ シーケンスです。

ISO-8859-1/Latin-1 にあると主張しているが、実際には Win-1252 であると主張するすべての引用符とアポストロフィを巻き毛に変更する迷惑な Microsoft 製品の 1 つによって「スマート引用」された可能性があります。 C0 プレーンがありません。その場合、Win-1252 エンコーディングのみがそのドキュメントを解析します。または、巻き毛のアポスを通常のものに切り替えることができ、すべて問題ありません。

于 2013-06-23T13:46:34.773 に答える