1. ホーム
  2. .net

[解決済み] 16進数値0x00は無効な文字です。

2022-02-10 19:07:40

質問

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で開始することを提案しました。