0x20 未満のもの (0x09、0x0a、0x0d、つまりタブ、キャリッジ リターン、ライン フィードを除く) は、XML ドキュメントに含めることはできません。
データベースから出てくるデータがあり、Web サービス要求への応答として渡されます。
Soap フォーマッタは 0x12 文字 (Ascii 18、Device Control 2) を喜んでエンコードしますが、 16 進値 0x12
のクライアントで応答が失敗し、無効な文字です。
<rant>
私が非常にイライラしているのは、これらが同じコインの表裏であり、クライアントとサービスの両方が .net アプリであることです。何も読み取れない場合、soap フォーマッタが不適切な xml を書き込むのはなぜですか?</rant>
どちらかにしたい
- これらの奇妙な文字を正しく処理する Xml シリアライザーを取得するか、
- Web サービスでリクエストを失敗させる
私はグーグルで検索しましたが、a)「入力をサニタイズする」またはb)「ドキュメント構造を変更する」以外に、これについて多くを見つけることができませんでした。
a) このデータの一部は 20 年以上前のものであるため、ランナーでは
ありません。b) 独自のフロント エンド以外に、Web サービスに対して直接コーディングするクライアントがあるため、選択肢はあまりありません。
私が見逃している明らかなものはありますか?それとも単に AscII 制御コード周辺のコードのケースですか?
ありがとう
更新
これは実際には XmlSerialiser の問題です。次のコードは無効な文字をストリームにシリアル化しますが、逆シリアル化はしません。
[Serializable]
public class MyData
{
public string Text { get; set; }
}
class Program
{
public static void Main(string[] args)
{
var myData = new MyData {Text = "hello "
+ ASCIIEncoding.ASCII.GetString(new byte[] { 0x12 })
+ " world"};
var serializer = new XmlSerializer(typeof(MyData));
var xmlWriter = new StringWriter();
serializer.Serialize(xmlWriter, myData);
var xmlReader = new StringReader(xmlWriter.ToString());
var newData = (MyData)serializer.Deserialize(xmlReader); // Exception
// hexadecimal value 0x12, is an invalid character.
}
}
XmlWriter を明示的に作成し、それを に渡すことで、xml の書き込みをチョークすることができますSerialise
(私自身の回答としてすぐに投稿します)。
これらの文字は重要なので、単に取り除くことはできません。送信前にエンコードし、読み取ったときにデコードする必要があります。これを行うための既存のフレームワーク メソッドがないように見えることに本当に驚いています。