दिलचस्प पोस्ट
जावा, लगातार बदलते ग्राफिक्स कैसे आकर्षित करें अक्षर अक्षर की जगह नहीं लेना दो टुकड़ों के बीच बुनियादी संचार "संरचना हैक" तकनीकी रूप से अपरिभाषित व्यवहार है? नेस्टेड क्लास 'का दायरा? ट्विटर बूटस्ट्रैप रिमोट मोडल हर बार एक ही सामग्री दिखाती है एंड्रॉइड स्टूडियो लेआउट पूर्वावलोकन कहां है? यह जांच कैसे करें कि स्ट्रिंग बेस 64 एन्कोडेड है या नहीं पायथन 3 आयात इरर: 'मॉड्यूल' नामक कोई मॉड्यूल 'कॉन्फ़िगरपर्स' पृष्ठ लोड पर ब्राउज़र ज़ूम स्तर कैसे बढ़ाएं? डेटटाइम के रूप में वर्तमान समय कैसे प्राप्त करें मैं SQLPLUS का उपयोग करते हुए CSV स्वरूपित फ़ाइल को कैसे स्पूल कर सकता हूं? जेएसटीएल / ईएल का इस्तेमाल करते हुए जेएसपीपी से पैरामीटरेटेड विधि को कैसे कॉल किया जाए फ़ायरफ़ॉक्स, सफारी और क्रोम के साथ क्लिपबोर्ड पर टेक्स्ट कॉपी / रखें मैनिफ़ेस्ट v1 से v2 तक क्रोम एक्सटेंशन बदलते समय पोर्ट त्रुटि

डेटा का उपयोग करने वाले XmlReader या XPathDocument के निर्माण से पहले आप एक XML- आधारित डेटा स्रोत से अवैध हेक्साडेसिमल वर्ण कैसे निकाल सकते हैं?

क्या एक्सएमएलआरडर में इसका इस्तेमाल करने से पहले एक्सएमएल आधारित डेटा स्रोत को साफ करने के लिए कोई आसान / सामान्य तरीका है, ताकि मैं एक्सएमएल डेटा पर एक्सैम्ड एक्सएमएल डाटा का इस्तेमाल कर सकूं जो एक्सचेंज में हेक्साडेसिमल कैरेक्टर प्रतिबंधों के अनुरूप नहीं है?

ध्यान दें:

  • समाधान को XML डेटा स्रोतों को संभालना जरूरी है जो यूटीएफ -8 के अलावा वर्ण एन्कोडिंग का उपयोग करते हैं, उदा। XML दस्तावेज़ घोषणा पर वर्ण एन्कोडिंग निर्दिष्ट करके। अमान्य हेक्साडेसिमल वर्णों को छेड़ने के दौरान स्रोत के चरित्र एन्कोडिंग का मिलान नहीं करना एक प्रमुख स्टिकिंग प्वाइंट है।
  • अमान्य हेक्साडेसिमल वर्णों को हटाने के लिए केवल हेक्साडेसिमल एन्कोडेड मानों को निकालना चाहिए, क्योंकि आप अक्सर उस डेटा में ऐसे href मान पा सकते हैं जिसमें एक स्ट्रिंग होती है जो हेक्साडेसिमल वर्ण के लिए एक स्ट्रिंग मैच होगी।

पृष्ठभूमि:

मुझे एक एक्सएमएल-आधारित डेटा स्रोत का उपभोग करने की जरूरत है जो किसी विशिष्ट प्रारूप (एटम या आरएसएस फ़ीड के अनुसार) के अनुरूप है, लेकिन उन डेटा स्रोतों का उपभोग करने में सक्षम होना चाहते हैं जो XML विनिर्देश प्रति अमान्य हेक्साडेसिमल अक्षरों वाले होते हैं।

.NET में अगर आपके पास एक स्ट्रीम है जो XML डेटा स्रोत का प्रतिनिधित्व करता है, और उसके बाद इसे XmlReader और / या XPathDocument के द्वारा पार्स करने का प्रयास करता है, तो एक्सएमएल डेटा में अवैध हेक्साडेसिमल वर्णों को शामिल करने के कारण एक अपवाद उठाया गया है। इस समस्या को हल करने का मेरा वर्तमान प्रयास स्ट्रीम को स्ट्रिंग के रूप में पार्स करना है और अमान्य हेक्साडेसिमल अक्षरों को हटाने और / या बदलने के लिए एक नियमित अभिव्यक्ति का उपयोग करना है, लेकिन मैं एक और प्रदर्शन समाधान की तलाश कर रहा हूं।

वेब के समाधान से एकत्रित समाधान "डेटा का उपयोग करने वाले XmlReader या XPathDocument के निर्माण से पहले आप एक XML- आधारित डेटा स्रोत से अवैध हेक्साडेसिमल वर्ण कैसे निकाल सकते हैं?"

यह सही नहीं हो सकता है (लोगों को इस अस्वीकरण की वजह से जोड़ा गया जोर), लेकिन उस मामले में मैंने जो कुछ किया है वह नीचे है। आप एक स्ट्रीम के साथ उपयोग करने के लिए समायोजित कर सकते हैं

/// <summary> /// Removes control characters and other non-UTF-8 characters /// </summary> /// <param name="inString">The string to process</param> /// <returns>A string with no control characters or entities above 0x00FD</returns> public static string RemoveTroublesomeCharacters(string inString) { if (inString == null) return null; StringBuilder newString = new StringBuilder(); char ch; for (int i = 0; i < inString.Length; i++) { ch = inString[i]; // remove any characters outside the valid UTF-8 range as well as all control characters // except tabs and new lines //if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r') //if using .NET version prior to 4, use above logic if (XmlConvert.IsXmlChar(ch)) //this method is new in .NET 4 { newString.Append(ch); } } return newString.ToString(); } 

मुझे यूजीन की श्वेतसूची की अवधारणा पसंद है मुझे मूल पोस्टर के समान एक काम करने की जरूरत थी, लेकिन मुझे सभी यूनिकोड वर्णों का समर्थन करने की आवश्यकता थी, न कि सिर्फ 0x00FD तक। एक्सएमएल युक्ति है:

चार = # x 9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# X10000- # x10FFFF]

.NET में, यूनिकोड वर्णों का आंतरिक प्रतिनिधित्व केवल 16 बिट्स है, इसलिए हम 0x10000-0x10FFFF स्पष्ट रूप से अनुमति नहीं दे सकते। एक्सएमएल युक्ति स्पष्ट रूप से प्रदर्शित होने से 0xD800 पर आरंभ किए जाने वाले किराए कोड बिंदुों को स्पष्ट रूप से अस्वीकार करता है। हालांकि यह संभव है कि अगर हम इन श्वेतसूची में इन सरोगेट कोड बिंदुओं को अनुमति देते हैं, तो हमारे स्ट्रिंग में यूटीएफ -8 एन्कोडिंग अंत में मान्य XML का उत्पादन कर सकता है, जब तक उचित यूटीएफ -8 एन्कोडिंग यूटएफ -16 अक्षरों के सरोगेट युग्म से उत्पन्न हुआ .NET स्ट्रिंग मैंने इसे हालांकि नहीं खोजा है, इसलिए मैं सुरक्षित शर्त के साथ गया और मेरे श्वेत सूची में प्रतिनिधि को अनुमति नहीं दी।

यूजीन के समाधान में टिप्पणियां भ्रामक हैं हालांकि, समस्या यह है कि जिन वर्णों को हम छोड़ रहे हैं वे XML में मान्य नहीं हैं … वे पूरी तरह से मान्य यूनिकोड कोड बिंदु हैं। हम `गैर- utf-8 अक्षर 'को नहीं हटा रहे हैं हम utf-8 वर्णों को निकाल रहे हैं जो ठीक-ठीक XML दस्तावेज़ों में प्रकट नहीं हो सकते हैं।

 public static string XmlCharacterWhitelist( string in_string ) { if( in_string == null ) return null; StringBuilder sbOutput = new StringBuilder(); char ch; for( int i = 0; i < in_string.Length; i++ ) { ch = in_string[i]; if( ( ch >= 0x0020 && ch <= 0xD7FF ) || ( ch >= 0xE000 && ch <= 0xFFFD ) || ch == 0x0009 || ch == 0x000A || ch == 0x000D ) { sbOutput.Append( ch ); } } return sbOutput.ToString(); } 

अमान्य XML वर्णों को निकालने का तरीका बताता है कि मैं आपको XmlConvert.IsXmlChar विधि का उपयोग करने का सुझाव देता हूं। इसे .NET Framework 4 के बाद से जोड़ा गया था और यह भी Silverlight में प्रस्तुत किया गया है। यहाँ छोटा नमूना है:

 void Main() { string content = "\v\f\0"; Console.WriteLine(IsValidXmlString(content)); // False content = RemoveInvalidXmlChars(content); Console.WriteLine(IsValidXmlString(content)); // True } static string RemoveInvalidXmlChars(string text) { char[] validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray(); return new string(validXmlChars); } static bool IsValidXmlString(string text) { try { XmlConvert.VerifyXmlChars(text); return true; } catch { return false; } } 

इस उत्तर के समाधान के सूखे कार्यान्वयन (एक अलग कन्स्ट्रक्टर का उपयोग करके – अपने आवेदन में जिस किसी की ज़रूरत है उसका उपयोग करने के लिए स्वतंत्र महसूस करें):

 public class InvalidXmlCharacterReplacingStreamReader : StreamReader { private readonly char _replacementCharacter; public InvalidXmlCharacterReplacingStreamReader(string fileName, char replacementCharacter) : base(fileName) { this._replacementCharacter = replacementCharacter; } public override int Peek() { int ch = base.Peek(); if (ch != -1 && IsInvalidChar(ch)) { return this._replacementCharacter; } return ch; } public override int Read() { int ch = base.Read(); if (ch != -1 && IsInvalidChar(ch)) { return this._replacementCharacter; } return ch; } public override int Read(char[] buffer, int index, int count) { int readCount = base.Read(buffer, index, count); for (int i = index; i < readCount + index; i++) { char ch = buffer[i]; if (IsInvalidChar(ch)) { buffer[i] = this._replacementCharacter; } } return readCount; } private static bool IsInvalidChar(int ch) { return (ch < 0x0020 || ch > 0xD7FF) && (ch < 0xE000 || ch > 0xFFFD) && ch != 0x0009 && ch != 0x000A && ch != 0x000D; } } 

द्न्यूवॉम्बे के उत्तर का आधुनिकीकरण, आप थोड़ा आसान दृष्टिकोण ले सकते हैं

 public static string RemoveInvalidXmlChars(string input) { var isValid = new Predicate<char>(value => (value >= 0x0020 && value <= 0xD7FF) || (value >= 0xE000 && value <= 0xFFFD) || value == 0x0009 || value == 0x000A || value == 0x000D); return new string(Array.FindAll(input.ToCharArray(), isValid)); } 

या, Linq के साथ

 public static string RemoveInvalidXmlChars(string input) { return new string(input.Where(value => (value >= 0x0020 && value <= 0xD7FF) || (value >= 0xE000 && value <= 0xFFFD) || value == 0x0009 || value == 0x000A || value == 0x000D).ToArray()); } 

मुझे यह जानने में दिलचस्पी होगी कि इन तरीकों के प्रदर्शन की तुलना कैसे की जाती है और Buffer.BlockCopy का उपयोग करके वे सभी ब्लैक लिस्ट के तरीकों की तुलना कैसे करते हैं।

रेगेक्स आधारित दृष्टिकोण

 public static string StripInvalidXmlCharacters(string str) { var invalidXmlCharactersRegex = new Regex("[^\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff](?![\udc00-\udfff]))|((?<![\ud800-\udbff])[\udc00-\udfff])"); return invalidXmlCharactersRegex.Replace(str, ""); 

}

अधिक जानकारी के लिए मेरे ब्लॉगपोस्ट देखें

यहां एक कस्टम स्ट्रीम रीडर में जवाब दिया गया है यह केवल एक वास्तविक स्ट्रीम रीडर को लपेटता है और वर्णों की जगह के रूप में पढ़ता है।

मैंने खुद को अपना समय बचाने के लिए कुछ ही तरीके लागू किए। मैं इसे XDocument.Load और एक फ़ाइल स्ट्रीम के साथ संयोजन में प्रयोग किया था और केवल पढ़ने (चार [] बफर, इंट इंडेक्स, इंट गिनती) को बुलाया गया था, इसलिए यह इस तरह काम किया। इसे अपने आवेदन के लिए काम करने के लिए आपको अतिरिक्त तरीकों को लागू करने की आवश्यकता हो सकती है। मैंने इस दृष्टिकोण का इस्तेमाल किया क्योंकि यह अन्य उत्तरों की तुलना में अधिक कुशल लगता है। मैंने केवल कंसल्टेंट्स में से एक को लागू किया है, आप स्पष्ट रूप से किसी भी StreamReader कंसल्टेंटर्स को लागू कर सकते हैं, क्योंकि यह केवल एक पास है

मैंने उन्हें निकालने के बजाय वर्णों को बदलना चुना क्योंकि यह समाधान को बहुत सरल करता है इस तरह, पाठ की लंबाई एक ही रहती है, इसलिए अलग सूची का ट्रैक रखने की कोई जरूरत नहीं है।

 public class InvalidXmlCharacterReplacingStreamReader : TextReader { private StreamReader implementingStreamReader; private char replacementCharacter; public InvalidXmlCharacterReplacingStreamReader(Stream stream, char replacementCharacter) { implementingStreamReader = new StreamReader(stream); this.replacementCharacter = replacementCharacter; } public override void Close() { implementingStreamReader.Close(); } public override ObjRef CreateObjRef(Type requestedType) { return implementingStreamReader.CreateObjRef(requestedType); } public void Dispose() { implementingStreamReader.Dispose(); } public override bool Equals(object obj) { return implementingStreamReader.Equals(obj); } public override int GetHashCode() { return implementingStreamReader.GetHashCode(); } public override object InitializeLifetimeService() { return implementingStreamReader.InitializeLifetimeService(); } public override int Peek() { int ch = implementingStreamReader.Peek(); if (ch != -1) { if ( (ch < 0x0020 || ch > 0xD7FF) && (ch < 0xE000 || ch > 0xFFFD) && ch != 0x0009 && ch != 0x000A && ch != 0x000D ) { return replacementCharacter; } } return ch; } public override int Read() { int ch = implementingStreamReader.Read(); if (ch != -1) { if ( (ch < 0x0020 || ch > 0xD7FF) && (ch < 0xE000 || ch > 0xFFFD) && ch != 0x0009 && ch != 0x000A && ch != 0x000D ) { return replacementCharacter; } } return ch; } public override int Read(char[] buffer, int index, int count) { int readCount = implementingStreamReader.Read(buffer, index, count); for (int i = index; i < readCount+index; i++) { char ch = buffer[i]; if ( (ch < 0x0020 || ch > 0xD7FF) && (ch < 0xE000 || ch > 0xFFFD) && ch != 0x0009 && ch != 0x000A && ch != 0x000D ) { buffer[i] = replacementCharacter; } } return readCount; } public override Task<int> ReadAsync(char[] buffer, int index, int count) { throw new NotImplementedException(); } public override int ReadBlock(char[] buffer, int index, int count) { throw new NotImplementedException(); } public override Task<int> ReadBlockAsync(char[] buffer, int index, int count) { throw new NotImplementedException(); } public override string ReadLine() { throw new NotImplementedException(); } public override Task<string> ReadLineAsync() { throw new NotImplementedException(); } public override string ReadToEnd() { throw new NotImplementedException(); } public override Task<string> ReadToEndAsync() { throw new NotImplementedException(); } public override string ToString() { return implementingStreamReader.ToString(); } } 

उपरोक्त समाधान XML को परिवर्तित करने से पहले अमान्य वर्णों को हटाने के लिए प्रतीत होते हैं।

एक XML स्ट्रिंग से अमान्य XML वर्णों को हटाने के लिए इस कोड का उपयोग करें। जैसे। और x1A;

  public static string CleanInvalidXmlChars( string Xml, string XMLVersion ) { string pattern = String.Empty; switch( XMLVersion ) { case "1.0": pattern = @"&#x((10?|[2-F])FFF[EF]|FDD[0-9A-F]|7F|8[0-46-9A-F]9[0-9A-F]);"; break; case "1.1": pattern = @"&#x((10?|[2-F])FFF[EF]|FDD[0-9A-F]|[19][0-9A-F]|7F|8[0-46-9A-F]|0?[1-8BCEF]);"; break; default: throw new Exception( "Error: Invalid XML Version!" ); } Regex regex = new Regex( pattern, RegexOptions.IgnoreCase ); if( regex.IsMatch( Xml ) ) Xml = regex.Replace( Xml, String.Empty ); return Xml; } 

http://balajiramesh.wordpress.com/2008/05/30/strip-illegal-xml-characters-based-on-w3c-standard/

अमान्य xml वर्णों को हटाने के लिए इस फ़ंक्शन का उपयोग करें।

 public static string CleanInvalidXmlChars(string text) { string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]"; return Regex.Replace(text, re, ""); } 

ऊपर दिए गए नवोलिक द्वारा संशोधित उत्तर या मूल उत्तर।
परिवर्तन: \ 0 चरित्र का पारित किया गया है, प्रतिस्थापन के बजाय निकाली जाने के बाद किया जाता है इसके अलावा, XmlConvert.IsXmlChar (char) विधि का उपयोग किया गया

  /// <summary> /// Replaces invalid Xml characters from input file, NOTE: if replacement character is \0, then invalid Xml character is removed, instead of 1-for-1 replacement /// </summary> public class InvalidXmlCharacterReplacingStreamReader : StreamReader { private readonly char _replacementCharacter; public InvalidXmlCharacterReplacingStreamReader(string fileName, char replacementCharacter) : base(fileName) { _replacementCharacter = replacementCharacter; } public override int Peek() { int ch = base.Peek(); if (ch != -1 && IsInvalidChar(ch)) { if ('\0' == _replacementCharacter) return Peek(); // peek at the next one return _replacementCharacter; } return ch; } public override int Read() { int ch = base.Read(); if (ch != -1 && IsInvalidChar(ch)) { if ('\0' == _replacementCharacter) return Read(); // read next one return _replacementCharacter; } return ch; } public override int Read(char[] buffer, int index, int count) { int readCount= 0, ch; for (int i = 0; i < count && (ch = Read()) != -1; i++) { readCount++; buffer[index + i] = (char)ch; } return readCount; } private static bool IsInvalidChar(int ch) { return !XmlConvert.IsXmlChar((char)ch); } } 
 private static String removeNonUtf8CompliantCharacters( final String inString ) { if (null == inString ) return null; byte[] byteArr = inString.getBytes(); for ( int i=0; i < byteArr.length; i++ ) { byte ch= byteArr[i]; // remove any characters outside the valid UTF-8 range as well as all control characters // except tabs and new lines if ( !( (ch > 31 && ch < 253 ) || ch == '\t' || ch == '\n' || ch == '\r') ) { byteArr[i]=' '; } } return new String( byteArr ); } 

आप निम्न के साथ गैर- UTF वर्णों को पारित कर सकते हैं:

 string sFinalString = ""; string hex = ""; foreach (char ch in UTFCHAR) { int tmp = ch; if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r') { sFinalString += ch; } else { sFinalString += "&#" + tmp+";"; } } 

PHP के लिए यह कोशिश करो!

 $goodUTF8 = iconv("utf-8", "utf-8//IGNORE", $badUTF8);