7
votes

Pourquoi org.apache.xerces.parsers.saxparser ne saute pas BOM dans UTF8 codé XML?

J'ai un XML avec le codage UTF8. Et ce fichier contient BOM un début du fichier. Donc, lors de l'analyse, je suis confronté à org.xml.sax.saxparseException: le contenu n'est pas autorisé dans Prolog. Je ne peux pas supprimer ces 3 octets des fichiers. Je ne peux pas charger le fichier dans la mémoire et les supprimer ici (les fichiers sont grands). Donc, pour des raisons de performance, j'utilise Sax Parser et que je veux juste sauter ces 3 octets s'ils sont présents avant "" Tag. Dois-je hériter d'InputStreamreader pour cela?

Je suis nouveau en Java - Montrez-moi la bonne façon s'il vous plaît.


3 Réponses :


4
votes

est venu avant, et je l'ai trouvé La réponse sur la pile débordement quand il m'est arrivé. La réponse liée utilise un pushbackinputtream pour tester la nomenclature.


0 commentaires

3
votes

J'ai connu le même problème et j'ai résolu ce code:

private static InputStream checkForUtf8BOM(InputStream inputStream) throws IOException {
    PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3);
    byte[] bom = new byte[3];
    if (pushbackInputStream.read(bom) != -1) {
        if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) {
            pushbackInputStream.unread(bom);
        }
    }
    return pushbackInputStream;
}


2 commentaires

Ceci est pour UTF8 ... J'assume UTF16 différerait (je crois que ses seulement 2 octets)?


Désolé pour le retard. Oui, UTF16 a BOM avec seulement deux octets: 0xfe 0xFF (Big-Endian) ou 0XFF 0XFE (Petit-Endian).



2
votes
// xml can be read from a file, url or string through a stream
URL url = new URL("some xml url");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
removeBOM(bufferedReader);

0 commentaires