Incolla da Word + Creare documento XML -> valore esadecimale 0x0C, è un carattere non valido (Net)

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

Domanda

Ho una pagina web che accetta HTML-input dagli utenti. L'ingresso viene convertito in un documento XML utilizzando lo spazio System.Xml, in questo modo:

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

Successivamente una trasformazione XSL (System.Xml.Xsl.XslCompiledTransform) viene utilizzato sui dati.

Gli utenti tendono a testo scrittura in Microsoft Word, utilizzando proiettili, citazioni, ecc Quando si incolla alla mia pagina, il loro testo include i caratteri non validi come ad esempio 0x0C, 0x03 e così via. Quando si utilizza la trasformazione XSL, questo errore si verifica "valore esadecimale 0x0C, è un carattere non valido".

Il mio fix finora è stato quello di eliminare i caratteri che ho trovato per essere offensivo, usando loop e String.Replace: Tutti i caratteri da 0 a 31, tranne 9, 10 e 13 sono sostituiti con String.Empty.

Quello che sto cercando è un modo migliore per fare questo. A built-in metodo Net? O forse solo un elenco completo dei caratteri Unicode illegali.

È stato utile?

Soluzione

Trovato due risposte che fanno la stessa cosa

  1. http: // seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/
  2. http://www.theplancollection.com / casa-correlate al piano-articles / esadecimale-valore non valido caratteri

I primi utilizzi uno StringBuilder, scorre caratteri uno a uno e filtra caratteri illegali. Il secondo usi una regex e .Rimontare per realizzare la stessa cosa. Entrambi gli autori guardato lo standard XML per scoprire quali personaggi sono illegali.

Ho fatto alcuni tempi su una lunga serie (run file di 1,8 MB 1.000 volte) e una breve stringa ( "Ciao mondo" run 10.000.000 volte). Il metodo StringBuilder era ~ 3 volte più veloce rispetto al regex. La regex era ovviamente solo una volta compilato, a differenza del codice a cui ho collegato.

stringa lungo:

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

breve stringa:

CleanInvalidXmlChars time: 00:00:05.2805834
SanitizeXmlString    time: 00:00:01.8319114
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top