2011-04-28 8 views
9

के दौरान अमान्य एक्सएमएल कैरेक्टर मैं एन्कोडिंग "यूटीएफ -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 क्लास में कुछ गड़बड़ है?

+0

क्या आप कृपया एक्सएमएल हेडर में जांच सकते हैं, जिसे मार्सेलिंग के बाद किस वर्ण में परिभाषित किया गया है? क्या यह यूटीएफ -8 है? – JMelnik

+0

एक्सएमएल हेडर में परिभाषित कोई वर्णसेट नहीं है, केवल । लेकिन मैंने इसे रखा है: 'm.setProperty (मार्शलर.जेक्सबी_एनसीओडीडींग," यूटीएफ -8 ");' – oliverwood

उत्तर

1

मुझे लगता है कि मुख्य समस्या marshalling के दौरान अवैध पात्रों से बचने के बारे में है। कुछ समान उल्लेख किया गया था here, आप इसे आजमा सकते हैं।

यह इस मामले में कोई फर्क नहीं पड़ता का प्रतिनिधित्व करते थे एन्कोडिंग, यह बस एक्सएमएल सामग्री में अनुमति नहीं है:

यह यूनिकोड marshaller.setProperty("jaxb.encoding", "Unicode");

+1

मैंने वहां वर्णित मार्शलिंग के दौरान अवैध पात्रों से बचने की कोशिश की, जो चरित्र संदर्भ में "0x1a" चरित्र को बदल रहा है "$ # x1a , " और एन्कोडिंग को "यूनिकोड" में बदल दिया, लेकिन मुझे अभी भी unmarshalling के दौरान एक त्रुटि मिली: _Character संदर्भ "& # x1A" एक अवैध XML वर्ण है ._ – oliverwood

2

को यूनिकोड वर्ण U + 001a illegal in XML 1.0 है एन्कोडिंग बदलने के लिए प्रदान करता है।

XML 1.1 allows some of the restricted characters (U + 001a सहित) शामिल किया जाना है, लेकिन वे आंकिक केरेक्टर सन्दर्भ (&#x1a;)

विकिपीडिया a nice summary of the situation है के रूप में उपस्थित होना चाहिए।

+0

क्या आप जानते हैं कि मार्शलर प्रॉपर्टी को XML 1.1 हेडर रखने के लिए कैसे सेट करें? मैंने यह कोशिश की लेकिन यह काम नहीं किया: 'm.setProperty (" com.sun.xml.bind.xmlHeaders "," ");' – oliverwood

+1

ऐसा लगता है कि जेएक्सबी नहीं करता अभी तक एक्सएमएल 1.1 का समर्थन नहीं करते हैं: http://java.net/jira/browse/JAXB-422 –

+1

मुझे नहीं लगता कि अपमानजनक चरित्र 0x02 है, {2} और {1} के आसपास घुंघराले ब्रेसिज़ को नोट करें, यह और अधिक दिखता है त्रुटि संदेश में प्लेसहोल्डर की तरह प्रतिस्थापित नहीं किया गया था। –

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