Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取XML文件的编码类型?_Java_Xml - Fatal编程技术网

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