Einfügen von Word + Erstellen von XML-Dokument -> hexadezimalen Wert 0x0C, ist ein ungültiges Zeichen (.NET)
-
03-10-2019 - |
Frage
Ich habe eine Webseite, die HTML-Eingaben von Benutzern akzeptiert. Die Eingabe wird umgewandelt in ein XML-Dokument mit den System.Xml
Namespace verwenden, wie folgt aus:
var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
doc.DocumentElement.SetAttribute("BodyHTML", theTextBox.Text);
Danach eine XSL-Transformation (System.Xml.Xsl.XslCompiledTransform
) auf die Daten verwendet.
Benutzer neigen dazu, zu schreiben Text in Microsoft Word, mit Kugeln, Zitate usw. Wenn auf meiner Seite einfügen, deren Text enthält ungültige Zeichen wie 0x0C, 0x03 und so weiter. Wenn die XSL-Transformation verwendet, tritt dieser Fehler auf „hexadezimalen Wert 0x0C, ein ungültiges Zeichen ist.“
Mein fix ist bisher die Zeichen zu beseitigen, dass ich gefunden habe, offensiv zu sein, mit Schleifen und String.Replace
:
Alle Zeichen von 0 bis 31, mit der Ausnahme 9, 10 und 13 sind mit String.Empty
ersetzt.
Was ich suche ist ein besserer Weg, dies zu tun. Ein eingebauter in .NET-Methode? Oder vielleicht nur die komplette Liste der illegalen Unicode-Zeichen.
Lösung
Gefunden zwei Antworten, die das gleiche tun
- http: // seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
- http://www.theplancollection.com / Haus-Plan-related-Artikel / hexadezimal-Wert-invalid-Zeichen
Die ersten Anwendungen ein String, Schleifen durch einzelne Zeichen nacheinander und filtert illegale Zeichen. Die zweite verwendet ein Regex und .replace das Gleiche zu erreichen. Beide basieren auf dem XML-Standard angesehen, um herauszufinden, welche Zeichen illegal sind.
Ich habe einige Timings auf einer langen Zeichenfolge (1.8 MB Datei Lauf 1000 mal) und eine kurze Zeichenfolge ( „Hallo Welt“ 10.000.000 mal laufen). Die Stringbuilder Methode war ~ 3-mal schneller als die regulären Ausdruck. Die Regex war natürlich nur einmal kompiliert, im Gegensatz zu dem Code, auf die ich verknüpft.
Lange string:
CleanInvalidXmlChars time: 00:00:07.4356230
SanitizeXmlString time: 00:00:02.3703305
Kurz string:
CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString time: 00:00:01.8319114