[解決済み] 16進数値0x00は無効な文字です。
質問
StringBuilderからXMLドキュメントを生成しているのですが、基本的には以下のようなものです。
string.Format("<text><row>{0}</row><col>{1}</col><textHeight>{2}</textHeight><textWidth>{3}</textWidth><data>{4}</data><rotation>{5}</rotation></text>
後、こんな感じ。
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
XmlNodeList labelSetNodes = document.GetElementsByTagName("labels");
for (int index = 0; index < labelSetNodes.Count; index++)
{
//do something
}
すべてのデータはデータベースから来る。 最近、エラーになることがあるんです。
16進数値0x00は無効な文字です、1行目、位置nnnnn
しかし、その一貫性はない。 時々、ある「空白の」データが動作することがあります。 あるPCでは「欠陥のある」データが動作するが、他のPCでは動作しない。
データベースでは、データは常に空白の文字列です。決して'null'ではありません。
で、XMLファイルでは、次のようになります。
< data>< /data>
つまり、オープニングとクロージングの間に文字がないのです。(ただし、vis studioの「即時」ウィンドウから引っ張ってきてtextpadに貼り付けているので、これが当てになるかどうかはわかりません)。
SQLサーバーのバージョンの違い(2008は失敗、2005はうまくいく)や照合順序の違いもあるかもしれません。 これらのどれかが原因として考えられるかどうかはわかりません。
しかし、全く同じコードとデータで失敗することがあります。どこに問題があるのか、何か思い当たることはありませんか?
解決方法は?
実際のデータやソースがない場合、何が問題なのかを診断することは困難です。しかし、いくつかの提案をすることができます。
- Unicode NUL (0x00) はすべてのバージョンの XML で不正であり、検証パーサーはこれを含む入力を拒否する必要があります。
- しかし、現実のXMLには、検証されていないあらゆる種類のゴミや不正なバイトが含まれている可能性があります。
- XML 1.1では、ゼロ幅と非印刷制御文字(NULを除く)を許可しているので、テキストエディタでXML 1.1ファイルを見て、それがどんな文字を含んでいるかを判断することはできません。
あなたが書いたことを考えると、データベースのデータをXMLに変換するものが壊れているのだと思います。
非XML文字(NUL、DEL、制御文字など)を含むデータベース項目をいくつか作成し、XMLコンバータを実行してみてください。そのXMLをファイルに出力し、HEXエディターで見てください。もしXMLでない文字が含まれていたら、コンバータが壊れています。修正するか、もしできないなら、そのような文字の出力を拒否するプリプロセッサを作成してください。
コンバータの出力が良好に見える場合、問題はXMLコンシューマにあります; 非XML文字をどこかに挿入しているのです。消費プロセスを個別のステップに分割し、各ステップでの出力を検証し、何が悪い文字を導入しているのかを絞り込む必要があります。
ファイルのエンコーディングのチェック(UTF-16の場合)
更新:私もちょうどこの例に遭遇しました。生産者がXMLをUTF16でエンコードしているのに、消費者がUTF8を期待していたのです。UTF16 はすべての ASCII 文字の上位バイトとして 0x00 を使用し、UTF8 はそうではないので、消費者は 2 バイトごとに NUL と見ていました。私の場合、エンコーディングを変更することができましたが、すべてのXMLペイロードをBOMで開始することを提案しました。
関連
-
[解決済み】コンパイラーエラーメッセージ。コンパイラはエラーコード -532462766 で失敗しました。
-
[解決済み] msiexec を使用せずにコマンドラインから MSI ファイルをアンインストールする
-
[解決済み] <Database> コンテキストを支えるモデルが、データベース作成後に変更されました。
-
[解決済み] Marginのプロパティ順
-
[解決済み] C#で文字を繰り返し表示する最適な方法
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] 小数の値を小数点以下2桁まで表示するには?
-
[解決済み] Visual Studioのコンパイルエラー "mismatch between processor architecture "を修正するにはどうしたらいいですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Microsoft.Practices.ServiceLocationはどこから来たのですか?
-
[解決済み] アセンブリから型を読み込めなかったエラー
-
[解決済み] ポストバックまたはコールバックの引数が無効です。 イベント検証は '<pages enableEventValidation="true"/>' を使用して有効になっています。
-
[解決済み] 16進数値0x00は無効な文字です。
-
[解決済み] VS2017/2015 で .xproj ファイルを開く方法
-
[解決済み] ネットワークの位置からアセンブリをロードすることはできません
-
[解決済み] Windowsイベントログで参照される「フレームワークのバージョン」とは何ですか?
-
[解決済み] DockPanelを空きスペースいっぱいに表示させる方法
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?