0

我注意到对于 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 发生了什么变化,如果有,如何避免?

提前谢谢了

4

2 回答 2

2

在 Android 4.4 KitKat 和更新版本下,不需要我的 WebArchiveReader 代码来回读已保存的 Web 存档。如果您使用 webview.saveWebArchive(name); 保存您的页面;在 KitKat 上使用方法,您会得到一个 MHTML 格式的文件,如上面的“@Dragon Warriors”所示。要将这个文件读回 webview,只需使用:

webView.loadUrl("file:///my_folder/mySavedPage.mht");

只需确保为您的文件提供 .mht 或 .mhtml 扩展名,以便 WebView 识别其内容。否则它可能只会以文本格式显示 MHTML 代码。

格雷格

于 2014-02-21T22:20:40.413 回答
1

我和你有完全相同的问题

显然,Android 4.4 WebView 将网络档案保存为MHTML。因此,您不能再使用WebArchiveReader

您可能希望使用其他一些 3rd party lib解析 MHTML 文件。祝你好运!

于 2013-12-04T18:14:39.263 回答