2011-03-07 25 views
0

我可以訪問.webarchive文件。到目前爲止,我已經從文件中創建了一個webarchive(使用PyObjC)。我希望修改DOM樹中的一些元素並將修改後的數據寫出。修改可可內的.webarchive並再次寫出

我想我需要訪問某個根DOM樹(webarchive是一個網頁,沒有鏈接)給一個WebArchive。

有沒有人有一個想法如何在可可做到這一點? 謝謝

回答

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

這是因爲一個黑客的一點點依賴於沒有記錄的歸檔格式的內部結構,但我認爲你可以很安全地認爲它不會發生巨大的變化。

+0

這很好。謝謝。 – Jaycee 2011-03-08 18:49:34