Coller à partir de Word + Créer un document XML -> valeur hexadécimale 0x0C, est un caractère non valide (.Net)

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

Question

J'ai une page Web qui accepte HTML entrée des utilisateurs. L'entrée est convertie en un document XML en utilisant l'espace de noms System.Xml, comme ceci:

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

Ensuite, une transformation XSL (de System.Xml.Xsl.XslCompiledTransform) est utilisé sur les données.

Les utilisateurs ont tendance à écrire du texte dans Microsoft Word, en utilisant des balles, des citations, etc. Lorsque vous collez sur ma page, leur texte contient des caractères non valides tels que 0x0C, 0x03 et ainsi de suite. Lors de l'utilisation de la transformation XSL, cette erreur se produit « valeur hexadécimale 0x0C, est un caractère non valide ».

Mon correctif a été jusqu'à présent pour éliminer les personnages que j'ai trouvé à être offensant, en utilisant des boucles et String.Replace: Tous les caractères de 0 à 31, à l'exception 9, 10 et 13 sont remplacés par des String.Empty.

Ce que je suis à la recherche est une meilleure façon de le faire. Une méthode intégrée .Net? Ou peut-être juste une liste complète des caractères unicode illégaux.

Était-ce utile?

La solution

trouvé deux réponses qui font la même chose

  1. http: // seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
  2. http://www.theplancollection.com / maison plan liés aux-articles / hexadécimal-valeur-invalid caractère

Les premières utilisations StringBuilder, boucle à travers les caractères un par un et les filtres sur les caractères illégaux. La seconde utilise une expression régulière et .replace pour accomplir la même chose. Les deux auteurs ont examiné la norme Xml pour savoir quels sont les caractères illégaux.

Je l'ai fait des timings sur une longue chaîne (1,8 Mo d'exécution 1000 fois fichier) et une courte chaîne ( « Bonjour tout le monde » run 10.000.000 fois). La méthode StringBuilder était ~ 3 fois plus rapide que l'expression rationnelle. Le regex était bien sûr que compilé une fois, à la différence du code auquel je LIÉ.

longue chaîne:

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

string courte:

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top