在java中获取XML的编码类型

我在java 1.4中使用DocumentBuilder解析XML。
XML的第一行是

 xml version="1.0" encoding="GBK" 

我想获得XML的编码类型并使用它。 我怎样才能获得“GBK”
基本上我将再制作一个XML,我希望保留encoding="GBK"
目前它正在迷失并设置为默认的UTF-8
有许多XML具有不同的编码我需要读取编码od源和必要的东西。

请帮忙

一种方法就是这样

 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(); 

这个适用于各种编码,同时考虑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) 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声明✓
  • 带BOM的UTF-8 XML文件,没有XML声明✓
  • 没有BOM的UTF-8 XML文件,没有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.*; 

使用javax.xml.stream.XMLStreamReader解析文件,然后可以调用getEncoding()