2012-02-24 21 views
6

Estoy analizando XML usando DocumentBuilder en java 1.4.
XML tiene como primera línea deObteniendo el tipo de codificación de un XML en java

xml version="1.0" encoding="GBK" 

Quiero conseguir el tipo de codificación de XML y utilizarlo. ¿Cómo puedo obtener "GBK"
Básicamente voy a hacer un XML más en el que quiero que se guarde encoding="GBK".
Actualmente se está perdiendo y se establece en el valor predeterminado UTF-8
Hay muchos XML con codificación diferente que necesito para leer la codificación de la fuente od y cosas tan necesarias.

Por favor, ayuda

+2

'org.w3c.dom.Document.getXmlEncoding()' ?? – artbristol

+0

Aunque esto es antiguo: hay una declaración oficial del W3C: https://www.w3.org/TR/xml/#sec-guessing –

Respuesta

0

Usando javax.xml.stream.XMLStreamReader para analizar su archivo, a continuación, se puede llamar getEncoding().

+0

bt lo necesito en Java 1.4 – user1228785

4

Una forma de que esto funciona como éste

final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(new FileReader(testFile)); 

//running on MS Windows fileEncoding is "CP1251" 
String fileEncoding = xmlStreamReader.getEncoding(); 

//the XML declares UTF-8 so encodingFromXMLDeclaration is "UTF-8" 
String encodingFromXMLDeclaration = xmlStreamReader.getCharacterEncodingScheme(); 
+0

En mi máquina MS Windows, 'getEncoding () '* always * devuelve' null'. 'getCharacterEncodingScheme()' solo devuelve la codificación declarada, el archivo * no * tiene una marca de orden de bytes UTF-8, sino que también 'null'. – Paramaeleon

1

Ésta trabaja para varias codificaciones, teniendo en refieren tanto a la lista de materiales y la declaración XML. Por defecto es UTF-8 si no se aplica:

String encoding; 
FileReader reader = null; 
XMLStreamReader xmlStreamReader = null; 
try { 
    InputSource is = new InputSource(file.toURI().toASCIIString()); 
    XMLInputSource xis = new XMLInputSource(is.getPublicId(), is.getSystemId(), null); 
    xis.setByteStream(is.getByteStream()); 
    PropertyManager pm = new PropertyManager(PropertyManager.CONTEXT_READER); 
    for (Field field : PropertyManager.class.getDeclaredFields()) { 
     if (field.getName().equals("supportedProps")) { 
      field.setAccessible(true); 
      ((HashMap<String, Object>) field.get(pm)).put(
        Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY, 
        new XMLErrorReporter()); 
      break; 
     } 
    } 
    encoding = new XMLEntityManager(pm).setupCurrentEntity("[xml]".intern(), xis, false, true); 
    if (encoding != "UTF-8") { 
     return encoding; 
    } 

    // From @matthias-heinrich’s answer: 
    reader = new FileReader(file); 
    xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(reader); 
    encoding = xmlStreamReader.getCharacterEncodingScheme(); 

    if (encoding == null) { 
     encoding = "UTF-8"; 
    } 
} catch (RuntimeException e) { 
    throw e; 
} catch (Exception e) { 
    throw new UndeclaredThrowableException(e); 
} finally { 
    if (xmlStreamReader != null) { 
     try { 
      xmlStreamReader.close(); 
     } catch (XMLStreamException e) { 
     } 
    } 
    if (reader != null) { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
     } 
    } 
} 
return encoding; 

probado en Java 6 con:

  • UTF-8 archivo XML con la lista de materiales, la declaración XML ✓
  • UTF-8 archivo XML sin BOM, la declaración XML ✓
  • UTF-8 Archivo XML con lista de materiales, sin declaración XML ✓
  • UTF-8 Archivo XML sin lista de materiales, sin XML Declaración ✓
  • ISO-8859-1 archivo XML (sin BOM), la declaración XML ✓
  • UTF-16LE archivo XML con la lista de materiales, sin declaración XML ✓
  • UTF-16BE archivo XML con la lista de materiales, sin declaración XML ✓

Permanente sobre los hombros de estos gigantes:

import java.io.*; 
import java.lang.reflect.*; 
import java.util.*; 
import javax.xml.stream.*; 
import org.xml.sax.*; 
import com.sun.org.apache.xerces.internal.impl.*; 
import com.sun.org.apache.xerces.internal.xni.parser.*; 
Cuestiones relacionadas