[VB/C#] System.Xml.XmlException 無効な文字の対策
VB/C# で XDocument.Load
や Parse
メソッドを呼んだときに「型 'System.Xml.XmlException’ のハンドルされていない例外が System.Xml.dll で発生しました」・「追加情報:’ ' (16 進数値 0xXX) は無効な文字です。 行 XX、位置 XX。」のような例外を避けるための話です。
GitHub など有名な開発者向けのサービスでも、このような例外を発生させる XML を出力していることは、よくあり、悩まされます。
原因
XML 内に改行やタブ以外の制御文字などが含まれているとこのような例外が発生します。ちなみに、IE で XML を表示しようとしてもエラーになります(Firefox などでは普通に表示できます)。
XML で有効な文字は次の通りのようです。
- #x9
- #xA
- #xD
- #x20-#xD7FF
- #xE000-#xFFFD
- #x10000-#x10FFFF
関連ページ: PRB: Parsing XML Containing Invalid Character May Raise ArgumentException
対策
読めることを優先し、これ以外の文字は削除してから XDocument.Parse
メソッドを呼ぶようにします。もし、制御文字が重要な場合は、HTML エンコードするように書き換えてください。
Sanitize 関数が今回用意した、文字列から XML で無効な文字列を削除して返す関数です。
Visual Basic (VB.NET)
https://gist.github.com/jz5/26ac310543c1314e60a1
C#
https://gist.github.com/jz5/65f3f5342dcf73a63292