0

.webarchive ファイルにアクセスできます。これまでのところ、ファイルから (PyObjC を使用して) webarchive を作成することができました。DOM ツリーのいくつかの要素を変更し、変更したデータを書き出したいと考えています。

WebArchive が与えられた場合、何らかのルート DOM ツリー (WebArchive はリンクのない 1 つの Web ページです) にアクセスする必要があると思います。

Cocoaでこれを行う方法を知っている人はいますか? ありがとうございました

4

2 に答える 2

0

WebArchiveをWebViewにロードするコードは正しいように見えます(私はPyObjCにあまり詳しくありません)。DOMの変更は、WebKit API(ドキュメント)のメソッドを使用して非常に簡単です。トリッキーな点は、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];

文書化されていないアーカイブ形式の内部構造に依存しているため、これは少しハックですが、大幅に変更されることはないとかなり安全に想定できると思います。

于 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 に答える