WebKitGtk를 사용하여 SVG 파일의 요소에 액세스하려고하는데 비참하게 실패합니다.WebKit을 사용하여 SVG DOM을 사용합니다.
using Gtk;
using WebKit;
public class WebKitTest : Window {
private WebView web_view;
private const string uri = "file:///tmp/test.svg";
public WebKitTest() {
set_default_size (800, 600);
web_view = new WebView();
var scrolled_window = new ScrolledWindow (null, null);
scrolled_window.set_policy (PolicyType.AUTOMATIC, PolicyType.AUTOMATIC);
scrolled_window.add (this.web_view);
var vbox = new VBox (false, 0);
vbox.add (scrolled_window);
add (vbox);
this.destroy.connect (Gtk.main_quit);
show_all();
this.web_view.load_uri (WebKitTest.uri);
var dom = web_view.get_dom_document();
var el = dom.get_document_element();
var child = el.first_element_child;
stdout.printf ("%s\n", child.tag_name);
var list = dom.get_elements_by_tag_name ("svg");
stdout.printf ("%lu\n", list.length);
assert (list == null);
var length = list.length;
assert (length == 0);
var svg = list.item (0);
var res = dom.evaluate ("//path", svg, null, 0, null);
DOMNode node;
while ((node = res.iterate_next()) != null) {
stdout.printf ("%s\n", (node as DOMElement).tag_name);
}
}
public static void main (string[] args) {
Gtk.init (ref args);
var test = new WebKitTest();
Gtk.main();
return 0;
}
}
이 valac --pkg webkitgtk 3.0 --pkg GTK + -3.0 webkittest.vala로 컴파일 :이 프로그램은 매우 간단하고 요소의 몇에서 점점 데이터에서 그냥 시도, 발라에하지만 Gtk3 만 설치 한 경우 불행히도 webkit-1.0 .vapi 및 .deps 파일을 새로운 webkitgtk-3.0 파일로 복사해야하고 gdk-2.0 및 gtk-2.0 발생을 바꿀 필요가 있습니다. deps 파일은 각각 gdk-3.0 및 gtk-3.0이됩니다.
DOM을 사용하여 SVG의 하위 요소에 액세스하는 것은 간단하지만이 코드가 "HEAD"를 제공하는 child.tag_name의 print 문에 도달하면 파일에 아무 것도 발견되지 않는다고 생각합니다. . 내가 만들고있는 파일은 잉크 스케이프를 사용하면서 보았던 꽤 표준적인 것이어야합니다.
WebKit은 내가로드하는 문서를 보지 못하는 이상한 일을합니까?
감사합니다.
업데이트 :
확실히 내가 사용할 때 G 객체의 유형을 검색하고 get_elements_by_tag_name ("몸") 내가 WebKitDOMHTMLBodyElement을 얻을에 의해 반환 된 노드를 인쇄 할 수 있기 때문에 웹킷은 HTML 문서에 모든 것을로드 것으로 보인다. 하는 것이 내가이있는 DOMDocument
var nsres = dom.create_ns_resolver (body);
DOMXPathResult res = null;
try {
res = dom.evaluate ("//*", body, nsres, 0, null);
} catch (Error e) {
stderr.printf ("%s\n", e.message);
}
DOMNode node;
try {
while ((node = res.iterate_next()) != null) {
stdout.printf ("%s\n", (node as DOMElement).tag_name);
}
} catch (Error e) {
stderr.printf ("%s\n", e.message);
}
에 다음 XPath 쿼리를 수행하는 시도 할 수 있습니다 내가 출력을 얻을 모두
지금 잃었어요HTML
HEAD
BODY
때문이다. SVG 파일은 정확하게로드되지만 문서의 일부가 아닙니다.
감사합니다. WebKit이 그렇게했는지는 몰랐습니다.하지만 SVG 문서의 MIME 유형을 인식하지 못하는 것이 궁금합니다. 당신이 제안한 것은 여전히 아무것도 반환하지 않으므로 나는 계속 놀고있을 것입니다. –
파일이 웹 서버에서 가져온 경우 MIME 형식을 가져 오거나 가져야합니다. HTTP 헤더에 들어 있기 때문입니다. 그러나 일반적으로 파일 시스템에서 오는 파일은 사용하지 않습니다. –