从 cocoa 中修改 .webarchive 并再次写出

Posted

技术标签:

【中文标题】从 cocoa 中修改 .webarchive 并再次写出【英文标题】:Modify a .webarchive from within cocoa and write out again 【发布时间】:2011-03-07 06:29:31 【问题描述】:

我可以访问 .webarchive 文件。到目前为止,我已经设法从文件中创建了一个 webarchive(使用 PyObjC)。我希望修改 DOM 树中的一些元素并将修改后的数据写出来。

我想我需要访问一些给定 WebArchive 的根 DOM 树(网络存档是一个网页,没有链接)。

有人知道如何在 Cocoa 中执行此操作吗? 谢谢

【问题讨论】:

【参考方案1】:

可能的解决方案(尚未检查)

from Foundation import *
import objc
import WebKit
from WebKit import *
d=NSData.dataWithContentsOfFile_("/tmp/x.webarchive")
ws=WebArchive.alloc().initWithData_(d)
wv=WebView.alloc().initWithFrame_frameName_groupName_(((100, 100),(100,100)), "foo",None)
mf=wv.mainFrame()
mf.loadArchive_(ws)

【讨论】:

【参考方案2】:

您将 WebArchive 加载到 WebView 中的代码看起来是正确的(我对 PyObjC 不是很熟悉)。使用 WebKit API (documentation) 中的方法修改 DOM 非常简单。棘手的一点是,一旦您修改了 DOM,并且想要将修改写回 WebArchive。简单地保存一个新的 WebArchive 是行不通的,因为这不会保留您的修改,因此您需要编写新的源。这里有一些代码可以做到这一点(这里的 WebView 是webview,原始的 WevArchive 位于 archivePath 并且修改后的版本也会写在那里):

//Get the string representation of the current DOM tree
NSString *sourceString = [(DOMhtmlElement *)[[[webview mainFrame] DOMDocument] documentElement] outerHTML];
NSData *sourceData = [sourceString dataUsingEncoding:NSUTF8StringEncoding];

//Load the archive from disk to a dictionary (it's a plist)
NSMutableDictionary *archive = [[NSMutableDictionary alloc] initWithContentsOfURL:[NSURL fileURLWithPath:archivePath]];
//Modify the main HTML
[(NSMutableDictionary *)[archive objectForKey:@"WebMainResource"] setObject:sourceData forKey:@"WebResourceData"];
//Write the plist back out
NSData *data = [NSPropertyListSerialization dataFromPropertyList:archive format:NSPropertyListBinaryFormat_v1_0 errorDescription:nil];
[data writeToURL:[NSURL fileURLWithPath:ArchivePath] atomically:YES];

这有点小题大做,因为它依赖于未记录的存档格式的内部结构,但我认为您可以放心地假设它不会发生巨大变化。

【讨论】:

以上是关于从 cocoa 中修改 .webarchive 并再次写出的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIWebView 在 iPhone 上创建 .webarchive 文件?

在 iPhone 上打开 .webarchive?

如何将可编辑内容保存到 WebArchive webView?

FMDB - 无法从 Cocoa 修改数据库

如何在 UIWebView 中保存 .webarchive?

如何在 iPhone 上创建 .webarchive? [关闭]