2012-03-14 10 views
17

मैं एक वेब सेवा बनाने के लिए स्प्रिंग, सीएक्सएफ और हाइबरनेट का उपयोग कर रहा हूं जो एक विदेशी डेटाबेस पर खोज क्वेरी करता है जिसे मैंने केवल पढ़ने के लिए उपयोग किया है।सीएक्सएफ का उपयोग करते समय डब्ल्यूएस आउटपुट में अमान्य वर्णों से कैसे निपटें?

समस्या यह है कि डेटाबेस में कुछ प्रविष्टियों में टेक्स्ट फ़ील्ड में अजीब वर्ण (0x2) होते हैं, और ऐसा लगता है कि सीएक्सएफ या लाइब्रेरी (एगेस?) जो हाइबरनेट सत्र से लौटाई गई वस्तुओं को संसाधित/क्रमबद्ध करने के लिए उपयोग करती है इसके साथ सौदा नहीं:

org.apache.cxf.aegis.DatabindingException: Error writing document.. Nested exception is com.ctc.wstx.exc.WstxIOException: Invalid white space character (0x2) in text to output (in xml 1.1, could output as a character entity) 

मैं इसके आसपास कैसे हो सकता हूं? आदर्श रूप में, मैं केवल उन पात्रों को हटा सकता हूं, क्योंकि वे मेरे आउटपुट के लिए कोई फर्क नहीं पड़ता ... धन्यवाद!

उत्तर

13
/** 
* From xml spec valid chars:<br> 
* #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]<br> 
* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.<br> 
* @param text The String to clean 
* @param replacement The string to be substituted for each match 
* @return The resulting String 
*/ 
public static String CleanInvalidXmlChars(String text, String replacement) { 
    String re = "[^\\x09\\x0A\\x0D\\x20-\\xD7FF\\xE000-\\xFFFD\\x10000-x10FFFF]"; 
    return text.replaceAll(re, replacement); 
} 

स्रोत: http://www.theplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-characterheplancollection.com/house-plan-related-articles/hexadecimal-value-invalid-character

+0

जो कि उस समय मैं जो कर रहा था उसके करीब है, इसलिए मैं इसे स्वीकार कर रहा हूं! – elias

+0

क्या यह गलत नहीं है? मेरा मतलब है, regexp (जावा के लिए भाग गया) होना चाहिए: "[^ \\ x09 \\ x0A \\ x0D \\ x20 - \\ xD7FF \\ xE000 - \\ xFFFD \\ x10000 - \\ x10FFFF]" – greguren

+0

यह मेरे लिए पूरी तरह से काम करता है –

7

मुझे यकीन नहीं है कि यह आपके प्रश्न का उत्तर दे, लेकिन यहां मुझे जो मिला वह है।

यहाँ वर्ग कि अपवाद फेंकता है: http://svn.codehaus.org/woodstox/wstx/trunk/src/java/com/ctc/wstx/api/InvalidCharHandler.java

लगता है वहाँ इस मुद्दे पर चर्चा के लिए यहाँ है की तरह: http://comments.gmane.org/gmane.comp.apache.cxf.user/4373

हो सकता है कि यह हो सकता है आप कर सकते हैं: तुम भी एक सेट कर सकते हैं " अक्षम करें .outputstream.optimization " एंडपॉइंट/बस पर संपत्ति को सचमुच आउटपुटस्ट्रीम पर सीधे लेखन अक्षम करने के लिए और हमेशा XMLStreamWriter के माध्यम से जाना है। SAAJModel को बनाए रखने के ऊपरी हिस्से के बिना एक ही चीज़ को पूरा करना चाहिए।

उम्मीद है कि यह थोड़ा सा मदद करता है।

+0

धन्यवाद, आदमी! मैंने वास्तव में इस प्रश्न को पोस्ट करने से पहले ही उस चर्चा को पढ़ा है। :) दान कुलप के जवाब से, मुझे समझ में आया कि मैं वर्णों को बदलने के लिए XMLStreamWriter के लिए एक रैपर लिख सकता हूं, मैं यह समझने की कोशिश कर रहा हूं कि यह कैसे करें ... – elias

+0

यदि मैं इसे सही ढंग से समझता हूं तो यह सिर्फ एक सफेद जगह है? क्या आप xml पर लिखने से पहले इसे अपने कोड में हटा सकते हैं/प्रतिस्थापित कर सकते हैं? –

+0

इसे अपने कोड में करने के लिए प्रतिक्रिया भेजने से पहले, सभी डेटाबेस ऑब्जेक्ट्स को स्मृति में डालने की आवश्यकता होगी। मैं सिर्फ समस्याग्रस्त डेटा के एक छोटे प्रतिशत के कारण ऐसा नहीं करना चाहता हूं। सीएक्सएफ के डेटा बाध्यकारी आउटपुट को ऑब्जेक्ट लिखने से पहले मुझे अक्षर को हटाने के लिए कोड डालना होगा ... मैं सीएक्सएफ के दस्तावेज़ों को पढ़ रहा हूं कि यह देखने के लिए कि कैसे जाना है। – elias

0

टॉप रेटेड जवाब है, मेरे लिए काम नहीं किया के रूप में दिया यूनिकोड एन्कोडिंग को अस्वीकार कर दिया गया था। थोड़ा-बहुत बदलाव तथापि के साथ, यह वांछित व्यवहार का प्रदर्शन किया:

public static String CleanInvalidXmlChars(String text, String replacement) { 
    String re = "[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\\u0001\\u0000-\\u0010\\uFFFF]"; 
    return text.replaceAll(re, replacement); 
} 
+0

यह रेगेक्स सभी वर्णों को 0x0-0x10 की सीमा में स्वीकार करता है। इनमें से अधिकांश एक्सएमएल में मान्य नहीं हैं। – Erik

0

वांछित व्यवहार को प्राप्त करने और अपवाद से बचने के लिए फेंके जाने, आप अपने खुद के साथ डिफ़ॉल्ट Woodstoks कारखाने com.ctc.wstx.stax.WstxOutputFactory का विस्तार करना होगा, कि अधिलेखित करने के लिए केवल चाहिए था com.ctc.wstx.api.InvalidCharHandler.ReplacingHandler के उदाहरण के साथ संपत्ति com.ctc.wstx.outputInvalidCharHandler। यह हैंडलर अमान्य लोगों को प्रतिस्थापन char को कन्स्ट्रक्टर तर्क के रूप में लेता है। अपने उदाहरण के साथ, META-INF/services/javax.xml.stream.XMLOutputFactory नाम की एक फ़ाइल बनाएं और इसके अंदर केवल अपने कार्यान्वयन का पूरा नाम रखें (सुनिश्चित करें कि इसे परिणामस्वरूप जार में मेटा-आईएनएफ/सेवा निर्देशिका के अंदर रखा जाएगा)।

आप अधिक जानकारी here पा सकते हैं।

एचटीएच!

+1

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18055529) – daniele3004

+0

संकेतों के अनुसार धन्यवाद, संकेतों के लिए धन्यवाद। – cristianoms

संबंधित मुद्दे