问题:
在解析XML文档时抛出:“Invalid byte 1 of 1-byte UTF-8 sequence.”错误。
产生的原因:
由于XML编码与将XML字符串转换成字节数组(getBytes()方法)时使用编码不一致所导致。
实例:
<?xml version='1.0' encoding='UTF-8' ?> <ROOT> <REF>false</REF> <MSG>错误信息:指定的信息不存在</MSG> </ROOT>
解析该XML的java代码:
public Map<String,Object> parseXMLToMap(String xml){
Map<String,Object> maps = new HashMap<String,Object>();
try{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(xml.getBytes()));
Element eleRef = (Element)doc.getElementsByTagName("REF").item(0);
Element eleMsg = (Element)doc.getElementsByTagName("MSG").item(0);
maps.put("REF", eleRef.getFirstChild().getNodeValue());
maps.put("MSG", eleMsg.getFirstChild().getNodeValue());
return maps;
} catch(Exception e){
e.printStackTrace();
}
return null;
}
注意:Document doc = db.parse(new ByteArrayInputStream(xml.getBytes()));该行代码将要解析的XML字符串以平台默认的字符编码方式转换成一个字节数组,然后创建ByteArrayInputStream对象传递给DocumentBuilder的parse方法进行解析。但是XML文件的encoding='UTF-8',然而windows平台默认编码并非UTF-8,因此产生了乱码。
解决办法:
将此行代码Document doc = db.parse(new ByteArrayInputStream(xml.getBytes()));
改成
Document doc = db.parse(new ByteArrayInputStream(xml.getBytes(Charset.forName("UTF-8"))));
问题即可解决。