2012-02-24 50 views
6

我在java 1.4中使用DocumentBuilder解析XML。
XML具有第一線作爲在java中獲取XML的編碼類型

xml version="1.0" encoding="GBK" 

我想要得到的XML的編碼類型和使用它。我怎樣才能得到「GBK」
基本上我會再製作一個XML,我希望encoding="GBK"被保留。
目前它正在迷路並設置爲默認值UTF-8
有許多不同編碼的XML我需要閱讀編碼od源碼和必要的東西。

請幫

+2

'org.w3c.dom.Document.getXmlEncoding()'? – artbristol 2012-02-24 11:52:22

+0

即使這是舊的:有一個官方的W3C聲明:https://www.w3.org/TR/xml/#sec-guessing – 2017-08-17 14:54:01

回答

0

使用javax.xml.stream.XMLStreamReader分析文件,那麼你可以調用getEncoding()。這個

+0

BT我需要它在Java 1.4 – user1228785 2012-02-24 11:50:15

4

一種方法是這樣的

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

在我的MS Windows機器上,'getEncoding( )'* always *返回'null'。 'getCharacterEncodingScheme()'只返回文件所聲明的編碼*不*有UTF-8字節順序標記,否則還有'null'。 – Paramaeleon 2016-03-04 09:24:07

1

這一個適用於各種編碼,考慮到既關注的BOM和XML聲明。默認爲UTF-8,如果不申請:

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; 

測試Java 6的有:與BOM

  • UTF-8 XML文件,以XML聲明✓無BOM
  • UTF-8 XML文件,以XML聲明✓
  • UTF-8帶BOM的XML文件,不含XML聲明✓
  • UTF-8 XML文件不含BOM,不含XML聲明✓
  • ISO-8859-1 XML文件(無BOM),與XML聲明✓與BOM
  • UTF-16LE XML文件,而XML聲明✓與BOM
  • UTF-16BE XML文件,而XML聲明✓

常委在這些巨人的肩膀上:

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.*;