لصق من Word + إنشاء مستند XML -> القيمة السداسية 0x0c ، هو حرف غير صالح (.NET)

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

سؤال

لدي صفحة ويب تقبل مدخلات HTML من المستخدمين. يتم تحويل الإدخال إلى مستند XML باستخدام 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: يتم استبدال جميع الأحرف من 0 إلى 31 ، باستثناء 9 و 10 و 13 String.Empty.

ما أبحث عنه هو طريقة أفضل للقيام بذلك. طريقة .NET مدمجة؟ أو ربما مجرد قائمة كاملة من أحرف Unicode غير القانونية.

هل كانت مفيدة؟

المحلول

وجدت إجابتين تفعل نفس الشيء

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

الأول يستخدم stringBuilder ، حلقات من خلال الأحرف واحدة تلو الأخرى وترشيح chars غير قانونية. الثاني يستخدم regex و .replace لإنجاز نفس الشيء. نظر كلا المؤلفين إلى معيار XML لمعرفة الشخصيات غير القانونية.

لقد قمت ببعض التوقيت على سلسلة طويلة (ملف 1.8 ميجابايت يعمل 1000 مرة) وسلسلة قصيرة ("Hello World" تدير 10،000،000 مرة). كانت طريقة StringBuilder أسرع 3 مرات من Regex. تم تجميع Regex بالطبع مرة واحدة فقط ، على عكس الرمز الذي ربطته.

سلسلة طويلة:

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