के दौरान अमान्य एक्सएमएल कैरेक्टर मैं एन्कोडिंग "यूटीएफ -8" का उपयोग कर एक्सएमएल फ़ाइल में वस्तुओं को मार्शल कर रहा हूं। यह फ़ाइल को सफलतापूर्वक उत्पन्न करता है।Unmarshall
An invalid XML character (Unicode: 0x{2}) was found in the value of attribute "{1}" and element is "0"
चरित्र 0x1A या \ u001a, जो UTF-8 में मान्य लेकिन एक्सएमएल में अवैध है: लेकिन जब मैं इसे वापस unmarshal करने की कोशिश करें, कोई त्रुटि है। जेएक्सबी में मार्शलर इस चरित्र को एक्सएमएल फाइल में लिखने की इजाजत देता है, लेकिन Unmarshaller इसे वापस पार्स नहीं कर सकता है। मैंने एक और एन्कोडिंग (यूटीएफ -16, ASCII, आदि) का उपयोग करने की कोशिश की लेकिन अभी भी त्रुटि।
सामान्य समाधान एक्सएमएल पार्सिंग से पहले इस अमान्य चरित्र को हटाने/बदलने के लिए है। लेकिन अगर हमें इस चरित्र की जरूरत है, तो अनैमरलिंग के बाद मूल चरित्र कैसे प्राप्त करें?
हालांकि यह समाधान की तलाश में, मैं unmarshalling से पहले एक विकल्प के चरित्र के साथ अमान्य वर्ण बदलना चाहते हैं (उदाहरण के लिए डॉट = "।")।
मैं इस वर्ग बनाया है:
FileReader fileReader = new FileReader(this.getFile());
Reader reader = new InvalidXMLCharacterFilterReader(fileReader);
Object o = (Object)um.unmarshal(reader);
किसी तरह पाठक चरित्र मैं चाहता हूँ के साथ अमान्य वर्ण को प्रतिस्थापित नहीं करता:
public class InvalidXMLCharacterFilterReader extends FilterReader {
public static final char substitute = '.';
public InvalidXMLCharacterFilterReader(Reader in) {
super(in);
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int read = super.read(cbuf, off, len);
if (read == -1)
return -1;
for (int readPos = off; readPos < off + read; readPos++) {
if(!isValid(cbuf[readPos])) {
cbuf[readPos] = substitute;
}
}
return readPos - off + 1;
}
public boolean isValid(char c) {
if((c == 0x9)
|| (c == 0xA)
|| (c == 0xD)
|| ((c >= 0x20) && (c <= 0xD7FF))
|| ((c >= 0xE000) && (c <= 0xFFFD))
|| ((c >= 0x10000) && (c <= 0x10FFFF)))
{
return true;
} else
return false;
}
}
फिर इस मैं कैसे पढ़ सकते हैं और फ़ाइल unmarshall है। यह एक गलत एक्सएमएल डेटा का परिणाम देता है जिसे अनारक्षित नहीं किया जा सकता है। क्या मेरे अवैधXMLCharacterFilterReader क्लास में कुछ गड़बड़ है?
क्या आप कृपया एक्सएमएल हेडर में जांच सकते हैं, जिसे मार्सेलिंग के बाद किस वर्ण में परिभाषित किया गया है? क्या यह यूटीएफ -8 है? – JMelnik
एक्सएमएल हेडर में परिभाषित कोई वर्णसेट नहीं है, केवल Xml संस्करण = "1.0"?>। लेकिन मैंने इसे रखा है: 'm.setProperty (मार्शलर.जेक्सबी_एनसीओडीडींग," यूटीएफ -8 ");' – oliverwood