word + create xml document-> hexadecimal value 0x0cからの貼り付けは、無効な文字(.net)です

StackOverflow https://stackoverflow.com/questions/2874330

質問

ユーザーからHTML入力を受け入れるWebページがあります。入力は、 System.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変換を使用する場合、このエラーは「ヘキサデシマル値0x0Cが無効な文字です」と発生します。

これまでの私の修正は、ループを使用して攻撃的であることがわかったキャラクターを排除することでした。 String.Replace:9、10、および13を除く0から31までのすべての文字が置き換えられます String.Empty.

私が探しているのは、これを行うためのより良い方法です。組み込みの.NETメソッド?または、おそらく違法なユニコード文字の完全なリストです。

役に立ちましたか?

解決

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

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

最初のものはStringBuilderを使用し、文字を1つずつループし、違法文字を除去します。 2つ目は、同じことを達成するためにRegexとReplaceを使用します。どちらの著者もXML標準を調べて、どの文字が違法であるかを調べました。

長い文字列(1.8 MBファイルが1,000回実行される)と短い文字列(「Hello World」が10,000,000回実行)でいくつかのタイミングを行いました。 StringBuilderメソッドは、正規表現の3倍高速でした。 Regexは、私がリンクしたコードとは異なり、もちろん1回だけコンパイルされました。

長い文字列:

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

短い文字列:

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top