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)
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?)
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();
}
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.
ce lien a un code java qui fonctionne parfaitement.
http://blog.mark-mclaren.info/2007/02/invalid-xml-characters-when-valid-utf8_5873.html
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
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);
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é.
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.