it-swarm.dev

È stato trovato un carattere XML non valido (Unicode: 0xc)

L'analisi di un file XML mediante il parser Java DOM risulta in:

[Fatal Error] os__flag_8c.xml:103:135: An invalid XML character (Unicode: 0xc) was found in the element content of the document.
org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0xc) was found in the element content of the document.
    at com.Sun.org.Apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
33
Ashish

Esistono alcuni caratteri non consentiti nei documenti XML, anche quando si incapsulano i dati in blocchi CDATA.

Se hai generato il documento, dovrai farlo l'entità lo codifica o spoglialo. Se si dispone di un documento che richiede errori, è necessario rimuovere questi caratteri prima di provare ad analizzarlo.

Vedi la risposta di dolmen in questa discussione: Caratteri non validi in XML

Dove si collega a questo articolo: http://www.w3.org/TR/xml/#charsets

Fondamentalmente, tutti i caratteri inferiori a 0x20 sono vietati, tranne 0x9 (TAB), 0xA (CR?), 0xD (LF?)

40
jishi
public String stripNonValidXMLCharacters(String in) {
    StringBuffer out = new StringBuffer(); // Used to hold the output.
    char current; // Used to reference the current character.

    if (in == null || ("".equals(in))) return ""; // vacancy test.
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught here; it should not happen.
        if ((current == 0x9) ||
            (current == 0xA) ||
            (current == 0xD) ||
            ((current >= 0x20) && (current <= 0xD7FF)) ||
            ((current >= 0xE000) && (current <= 0xFFFD)) ||
            ((current >= 0x10000) && (current <= 0x10FFFF)))
            out.append(current);
    }
    return out.toString();
}    
8
Dima

Il carattere 0x0C non è valido in XML 1.0 ma sarebbe un carattere valido in XML 1.1 . Quindi, a meno che il file xml non specifichi la versione 1.1 nel prologo, è semplicemente non valido e dovresti lamentarti con il produttore di questo file.

6
Jörn Horstmann

Questo collegamento ha un Java che funziona perfettamente.

http://blog.mark-mclaren.info/2007/02/invalid-xml-characters-when-valid-utf8_5873.html

2
Vikram

Ogni volta che un carattere xml non valido viene xml, viene visualizzato tale errore. Quando lo apri in notepad ++ sembra VT, SOH, FF come questi sono caratteri XML non validi. Sto usando XML versione 1.0 e convalido i dati di testo prima di inserirli nel database per modello

Pattern p = Pattern.compile("[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u10000-\u10FFF]+"); 
retunContent = p.matcher(retunContent).replaceAll("");

Garantirà che nessun carattere speciale non valido venga inserito in XML

2
Komal

Puoi filtrare tutti i caratteri "non validi" con una classe FilterReader personalizzata:

public class InvalidXmlCharacterFilter extends FilterReader {

    protected InvalidXmlCharacterFilter(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 read;

        for (int i = off; i < off + read; i++) {
            if (!XMLChar.isValid(cbuf[i])) cbuf[i] = '?';
        }
        return read;
    }
}

Ed eseguilo in questo modo:

InputStream fileStream = new FileInputStream(xmlFile);
Reader reader = new BufferedReader(new InputStreamReader(fileStream, charset));
InvalidXmlCharacterFilter filter = new InvalidXmlCharacterFilter(reader);
InputSource is = new InputSource(filter);
xmlReader.parse(is);
2
Vadim Zin4uk

Tutte queste risposte sembrano supporre che l'utente stia generando il codice XML errato, anziché riceverlo da gSOAP, che dovrebbe conoscere meglio!

0
Jerry Miller

Per le persone che stanno leggendo array di byte in String e stanno provando a convertire in oggetto con JAXB, è possibile aggiungere la codifica "iso-8859-1" creando String da array di byte in questo modo:

String JAXBallowedString = new String (input byte [], "iso-8859-1");

Ciò sostituirà il byte in conflitto con la codifica a byte singolo che JAXB può gestire. Ovviamente questa soluzione è solo per analizzare l'xml.

0
BatBold

Ho riscontrato un problema simile in cui XML conteneva caratteri di controllo. Dopo aver esaminato il codice, ho scoperto che una classe deprecata, StringBufferInputStream, è stata utilizzata per leggere il contenuto delle stringhe.

http://docs.Oracle.com/javase/7/docs/api/Java/io/StringBufferInputStream.html

This class does not properly convert characters into bytes. As of JDK 1.1, the preferred way to create a stream from a string is via the StringReader class.

L'ho cambiato in ByteArrayInputStream e ha funzionato bene.

0
Mohit