我可以訪問.webarchive文件。到目前爲止,我已經從文件中創建了一個webarchive(使用PyObjC)。我希望修改DOM樹中的一些元素並將修改後的數據寫出。修改可可內的.webarchive並再次寫出
我想我需要訪問某個根DOM樹(webarchive是一個網頁,沒有鏈接)給一個WebArchive。
有沒有人有一個想法如何在可可做到這一點? 謝謝
我可以訪問.webarchive文件。到目前爲止,我已經從文件中創建了一個webarchive(使用PyObjC)。我希望修改DOM樹中的一些元素並將修改後的數據寫出。修改可可內的.webarchive並再次寫出
我想我需要訪問某個根DOM樹(webarchive是一個網頁,沒有鏈接)給一個WebArchive。
有沒有人有一個想法如何在可可做到這一點? 謝謝
可能的解決方法(沒有檢查尚未)
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)
您的代碼到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];
這是因爲一個黑客的一點點依賴於沒有記錄的歸檔格式的內部結構,但我認爲你可以很安全地認爲它不會發生巨大的變化。
這很好。謝謝。 – Jaycee 2011-03-08 18:49:34