XML non valide Personnage Pendant Unmarshall
Je suis ordonnancement des objets de fichier XML en utilisant l'encodage "UTF-8". Il génère des fichiers avec succès. Mais quand j'essaie de unmarshal en arrière, il y a une erreur:
Un fichier XML non valide de caractères (Unicode:
0x{2}) a été trouvé dans la valeur de
l'attribut "{1}" et de l'élément est "0"
Le personnage est 0x1A ou \u001a, ce qui est valable en UTF-8, mais illégal en XML. Marshaller dans JAXB permet l'écriture de ce personnage dans un fichier XML, mais Unmarshaller ne peut pas analyser le dos. J'ai essayé d'utiliser un autre encodage (UTF-16, ASCII, etc), mais toujours l'erreur.
La solution courante est de supprimer/remplacer ce caractère non valide avant d'analyse XML. Mais si nous avons besoin de ce caractère, la façon d'obtenir le caractère original après unmarshalling?
Alors que la recherche de cette solution, je veux remplacer les caractères non valides avec un caractère de substitution (par exemple dot = ".") avant unmarshalling.
J'ai créé cette classe:
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;
}
}
Alors c'est comment je l'ai lu et unmarshall le fichier:
FileReader fileReader = new FileReader(this.getFile());
Reader reader = new InvalidXMLCharacterFilterReader(fileReader);
Object o = (Object)um.unmarshal(reader);
En quelque sorte le lecteur de ne pas remplacer des caractères non valides avec le personnage que je veux. Il en résulte un mal de données XML qui ne peut pas être unmarshalled. Est-il quelque chose de mal avec mon InvalidXMLCharacterFilterReader classe?
Il n'y a pas de jeu de caractères défini dans l'en-tête XML, seulement <?xml version="1.0" ?>. Mais j'ai mis ceci:
m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
OriginalL'auteur oliverwood | 2011-04-28
Vous devez vous connecter pour publier un commentaire.
Le caractère Unicode U+001A est illégale en XML 1.0:
Le codage utilisé pour représenter il n'a pas d'importance dans ce cas, il est tout simplement pas le droit à du contenu XML.
XML 1.1 permet à certains caractères restreints (U+001A), mais ils doit être présent en tant que références à des caractères numériques (

)Wikipedia a un bon résumé de la situation.
m.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.1\"?>");
Il ressemble à JAXB ne prend pas en charge XML 1.1 encore: java.net/jira/browse/JAXB-422
Je ne pense pas que la délinquance personnage est 0x02, notez les accolades autour de {2} et le {1}, cela ressemble plus à des espaces réservés dans le message d'erreur ne sont pas remplacés.
vous avez raison, U+001A semble être le problème, mais que le caractère a le même problème.
Peut-il être traité en utilisant un autre Sérialisation XML API?
OriginalL'auteur Joachim Sauer
Je pense que le principal problème est d'environ échapper les caractères illégaux au cours de triage. Quelque chose de semblable a été mentionné ici, vous pourriez essayer.
Il propose de modifier l'encodage Unicode
marshaller.setProperty("jaxb.encoding", "Unicode");
OriginalL'auteur JMelnik