Un caractère XML invalide (Unicode: 0xc) a été trouvé

L'analyse D'un fichier XML à L'aide de L'analyseur Java DOM aboutit à:

[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
demandé sur 030 2011-04-21 14:05:44

8 réponses

il y a quelques caractères qui ne sont pas autorisés dans les documents XML, même lorsque vous encapsulez des données dans des blocs CDATA.

si vous avez généré le document, vous devez l'encoder ou le rayer. Si vous avez un document irrégulier, vous devriez enlever ces caractères avant d'essayer de le parser.

voir la réponse de dolmens dans ce thread: caractères invalides dans XML

où il renvoie à cet article: http://www.w3.org/TR/xml/#charsets

En Gros, tous les caractères en dessous de 0x20 sont rejetés, sauf 0x9 (TAB), 0xA (CR?), 0xD (LF?)

40
répondu jishi 2017-05-23 12:17:30
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();
}    
7
répondu Dima 2015-11-12 16:46:48

le caractère 0x0C n'est pas valide dans XML 1.0 mais serait un caractère valide dans XML 1.1 . Donc, à moins que le fichier xml spécifie la version 1.1 dans le prolog, il est tout simplement invalide et vous devriez vous plaindre au producteur de ce fichier.

6
répondu Jörn Horstmann 2011-04-21 11:09:02
2
répondu Vikram 2013-12-06 05:39:57

chaque fois qu'un caractère xml non valide vient xml, il donne une telle erreur. Quand u l'ouvre dans notepad++ , il ressemble à VT, SOH, FF comme ceux-ci sont des caractères xml invalides. Je m à l'aide de xml version 1.0 et je valide les données de texte avant d'entrer dans la base de données par le modèle

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

il veillera à ce qu'aucun caractère spécial invalide n'entre dans xml

2
répondu Komal 2016-05-07 07:10:46

vous pouvez filtrer tous les caractères 'invalides' avec une classe de FilterReader personnalisée:

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;
    }
}

Et l'exécuter comme ceci:

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
répondu Vadim Zin4uk 2017-06-15 13:25:32

j'ai fait face à un problème similaire où XML contenait des caractères de contrôle. Après avoir regardé le code, j'ai trouvé qu'une classe dépréciée,StringBufferInputStream, était utilisée pour lire le contenu de la chaîne.

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.

Je l'ai changé en ByteArrayInputStream et ça a bien marché.

0
répondu Mohit 2014-02-14 08:46:02

pour les personnes qui lisent un tableau d'octets en chaîne et qui essaient de le convertir en objet avec JAXB, vous pouvez ajouter l'encodage" iso-8859-1 "en créant une chaîne à partir d'un tableau d'octets comme ceci:

Chaîne JAXBallowedString= new String(byte [entrée], "iso-8859-1");

cela remplacerait le codage de byte à un seul byte que JAXB peut gérer. De toute évidence, cette solution ne sert qu'à analyser le xml.

0
répondu user2770401 2017-12-13 16:29:35