0

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

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

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

4

2 回答 2

0

您将 WebArchive 加载到 WebView 中的代码看起来是正确的(我对 PyObjC 不是很熟悉)。使用 WebKit API(文档)中的方法修改 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];

这有点像 hack,因为它依赖于未记录的存档格式的内部结构,但我认为您可以非常安全地假设它不会发生巨大变化。

于 2011-03-08T02:05:07.863 回答
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)
于 2011-03-07T06:41:50.537 回答