word + create xml document-> hexadecimal value 0x0cからの貼り付けは、無効な文字(.net)です
-
03-10-2019 - |
質問
ユーザーから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つの答えを見つけました
- http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
- 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