Java 获取XML文件的编码类型?
我正在使用Java 获取XML文件的编码类型?,java,xml,Java,Xml,我正在使用DocumentBuilder解析XML XML的第一行如下所示: xml version="1.0" encoding="GBK" 我想得到XML的编码类型并使用它。如何获得“GBK” 基本上,我将在希望保留encoding=“GBK”的地方再生成一个XML 目前它正在丢失并设置为默认值UTF-8 有许多不同编码的XML,我需要读取源文件的编码。使用javax.XML.stream.XMLStreamReader解析您的文件,然后您可以调用g
DocumentBuilder
解析XML
XML的第一行如下所示:
xml version="1.0" encoding="GBK"
我想得到XML的编码类型并使用它。如何获得“GBK”
基本上,我将在希望保留encoding=“GBK”
的地方再生成一个XML
目前它正在丢失并设置为默认值UTF-8
有许多不同编码的XML,我需要读取源文件的编码。使用
javax.XML.stream.XMLStreamReader
解析您的文件,然后您可以调用getEncoding()
这样做的一种方法
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<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;
使用Apache Commons IO:
new XmlStreamReader(data).getEncoding()
org.w3c.dom.Document.getXmlEncoding()
?尽管这是一个古老的说法:w3c有一个官方声明:在我的MS Windows机器上,getEncoding()
始终返回null
getCharacterEncodingScheme()
仅返回声明的编码文件没有UTF-8字节顺序标记,否则也将null
。
new XmlStreamReader(data).getEncoding()