我注意到对于 Android 4.4 手机,保存 webview:
webview.saveWebArchive(名称);
并在使用 WebArchiveReader WebArchiveReader(请参见下面的代码)阅读后引发编码异常:
11-08 15:10:31.976: W/System.err(2240): org.xml.sax.SAXParseException: 文档意外结束 11-08 15:10:31.976: W/System.err(2240): 在 org .apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:125)
用于读取存储的 XML 文件的方法在 4.3 之前工作得非常好,并且它是(注意:我尝试以两种不同的方式解析它):
public boolean readWebArchive(InputStream is) {
DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
myDoc = null;
try {
builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
try {
//New attempt
InputSource input = new InputSource(is);
input.setEncoding("UTF-8");
myDoc = builder.parse(input);
//This used to be the way it used to work for
//Android 4.3 and below without trouble
//myDoc = builder.parse(is);
NodeList nl = myDoc.getElementsByTagName("url");
for (int i = 0; i < nl.getLength(); i++) {
Node nd = nl.item(i);
if(nd instanceof Element) {
Element el = (Element) nd;
// siblings of el (url) are: mimeType, textEncoding, frameName, data
NodeList nodes = el.getChildNodes();
for (int j = 0; j < nodes.getLength(); j++) {
Node node = nodes.item(j);
if (node instanceof Text) {
String dt = ((Text)node).getData();
byte[] b = Base64.decode(dt, Base64.DEFAULT);
dt = new String(b);
urlList.add(dt);
urlNodes.add((Element) el.getParentNode());
}
}
}
}
} catch (SAXParseException se){
//Some problems parsing the saved XML file
se.printStackTrace();
myDoc = null;
} catch (Exception e) {
e.printStackTrace();
myDoc = null;
}
return myDoc != null;
}
我已经对调用 buider 的方式进行了一些尝试。我没有给它一个 FileInputStream,而是首先创建一个 InputSource,如您所见,以强制使用给定的编码。然而,我没有成功。通过不包括 InputSource,异常是:
org.xml.SAXParseException:意外的令牌
我在以前的帖子中读到这可能是一个编码问题(例如android-utf-8-file-parsing),但没有一个建议的解决方案对我有用。
有没有其他人有同样的问题,或者有人知道 Kit Kat 发生了什么变化,如果有,如何避免?
提前谢谢了