从 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 文件?
如何将可编辑内容保存到 WebArchive webView?