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

时间:2011-03-07 06:29:32

标签: cocoa dom pyobjc webarchive

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

我想我需要在给定WebArchive的情况下访问一些根DOM树(webarchive是一个没有链接的网页)。

有没有人知道如何在Cocoa中做到这一点? 谢谢

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

将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];

这有点像黑客,因为它依赖于未记录的存档格式的内部结构,但我认为你可以非常安全地假设它不会大幅改变。