Explication de JAXB erreur: Invalid 1 octet 1 octets UTF-8 séquence
Nous faisons l'analyse d'un document XML à l'aide de JAXB et obtiens cette erreur:
[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)
Ce que fait exactement ce que cela signifie et comment pouvons-nous résoudre ce problème??
Nous exécutons le code comme:
jaxbContext = JAXBContext.newInstance(Results.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(getSchema());
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile));
Mise à jour
Problème semble être dû à cette "drôle" de caractère dans le fichier XML: ¿
Pourquoi serait-ce causer un tel problème??
Mise à jour 2
Il y a deux de ces caractères bizarres dans le fichier. Ils sont vers le milieu du fichier. Notez que le fichier est créé sur la base de données dans une base de données et de celles des caractères bizarres en quelque sorte entré dans la base de données.
Mise à jour 3
Ici, c'est la pleine fragment de code XML:
<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description>
Mise à jour 4
Noter qu'il n'y a pas de <?xml ...?>
en-tête.
L'hexagone pour le caractère spécial est BF
Ajout de quelques infos. Est-ce que cela a du sens?? Merci pour votre aide!
Vous pouvez poster à la section du fichier XML qui inclut le texte incriminé.
Posté dans "update 3"
Vous pouvez également poster
<?xml ...?>
en-tête et la représentation hexadécimale de la partie incriminée.
OriginalL'auteur Marcus Leon | 2010-06-14
Vous devez vous connecter pour publier un commentaire.
Donc, vous le problème, c'est que JAXB traite les fichiers XML sans
<?xml ...?>
en-tête en tant que UTF-8, lorsque votre fichier utilise un autre encodage (probablement ISO-8859-1 ou Windows-1252, si0xBF
caractère en fait destiné à le dire¿
).Si vous pouvez modifier le producteur du fichier, vous pouvez ajouter
<?xml ...?>
- tête avec codage réel spécification, ou tout simplement utiliser UTF-8 pour l'écriture d'un fichier.Si vous ne pouvez pas changer le producteur, vous devez utiliser
InputStreamReader
avec codage explicite spécification, parce que (malheureusement) JAXB ne permettent pas de changer son codage par défaut:Cependant, cette solution est fragile, il échoue sur les fichiers d'entrée avec
<?xml ...?>
- tête avec un codage différent de spécification.Qui fonctionne! Notez que ce code ne fonctionne que sur ce fichier qui n'aura jamais l'en-tête xml. Quel est l'avantage/diff de cette approche par rapport à ceci:
results = (Results) unmarshaller.unmarshal(new FileReader(inputFile));
utilise le système de codage par défaut, lorsque
InputStreamReader
utilise explicitement indiquées.Merci...cela a fonctionné pour moi aussi..cependant, messagerie unifiée.unmarshall(new InputStreamReader(nouveau ByteArrayInputStream(xml.getBytes()), jeu de caractères.forName("UTF-8"))) ..... cela peut analyser la chaîne indépendamment de la présence de l'en-tête (avec l'encodage UTF-8) dans le xml. Pourquoi? Une autre chose, il n'était pas de travailler plus tôt avec... euh.unmarshall(nouveau SAXSource(nouveau InputSource(nouveau ByteArrayInputStream(xml.getBytes())))) ..u pourrait plz expliquer la raison?
OriginalL'auteur axtavt
C'est probablement un Marque d'Ordre des octets (BOM), et est une séquence spéciale d'octets au début d'un fichier UTF. Ils sont, franchement, une douleur dans le cul, et semblent particulièrement fréquents lors de l'interaction avec .net des systèmes.
Essayez de reformuler votre code pour utiliser un
Reader
plutôt qu'unInputStream
:Un
Reader
est UTF-conscient, et pourrait faire un meilleur coup de couteau à elle. Plus simplement, passer leFile
directement à laUnmarshaller
, et de laisser leJAXBContext
s'en soucier:À l'aide de la
FileReader
semble bon. Eu la même erreur quand j'ai juste précisé leFile
. Va valider tous mes résultats mais ça a l'air bon!!!Mais si je comprends bien, ces juste sembler "bizarre" des personnages, et non pas une "Marque d'Ordre d'Octet", non? Pourquoi font-ils la cause de cette difficulté?
Ainsi, la NOMENCLATURE est une séquence de caractères bizarres, denending sur la façon dont vous regardez.
OriginalL'auteur skaffman
Il semble que votre XML est encodé en UTF-16, mais que l'encodage n'est pas passé à la Unmarshaller. Avec le Marshaller vous pouvez définir que l'utilisation de
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16");
mais parce que le Unmarshaller n'est pas nécessaire à l'appui de toutes les propriétés, je ne suis pas sûr de la façon de le faire valoir d'autres que de s'assurer que votre document XML aencoding="UTF-16"
dans la première<?xml?>
élément.Vous êtes correct. Je regardais les différents codages et mêlé.
OriginalL'auteur Andy