3

ユーザーからの HTML 入力を受け入れる Web ページがあります。System.Xml入力は、次のように名前空間を使用して xml ドキュメントに変換されます。

var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
doc.DocumentElement.SetAttribute("BodyHTML", theTextBox.Text);

その後、データに対して Xsl 変換 ( System.Xml.Xsl.XslCompiledTransform) が使用されます。

ユーザーは、箇条書きや引用符などを使用して、Microsoft Word でテキストを記述する傾向があります。マイ ページに貼り付けると、テキストに 0x0C、0x03 などの無効な文字が含まれます。xsl 変換を使用すると、「16 進値 0x0C は無効な文字です」というエラーが発生します。

これまでの私の修正は、ループと を使用して、攻撃的であることがわかった文字を削除することでしString.ReplaceString.Empty

私が探しているのは、これを行うためのより良い方法です。組み込みの .Net メソッド? あるいは、違法な Unicode 文字の完全なリストかもしれません。

4

1 に答える 1

9

同じことをする2つの答えが見つかりました

  1. http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
  2. http://www.theplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-character

1 つ目は StringBuilder を使用し、文字を 1 つずつループして、不正な文字を除外します。2 つ目は、正規表現と .Replace を使用して同じことを実現します。どちらの作成者も Xml 標準を調べて、どの文字が不正かを調べました。

長い文字列 (1.8 MB のファイルを 1,000 回実行) と短い文字列 ("Hello world" を 10,000,000 回実行) でいくつかのタイミングを計りました。StringBuilder メソッドは、正規表現よりも ~ 3 倍高速でした。もちろん、リンク先のコードとは異なり、正規表現は一度しかコンパイルされていません。

長い文字列:

CleanInvalidXmlChars time: 00:00:07.4356230
SanitizeXmlString    time: 00:00:02.3703305

短い文字列:

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
于 2010-05-20T15:06:26.980 に答える