Я пытаюсь получить доступ к элементам SVG-файла с помощью WebKitGtk, но я терплю неудачу. Программа находится в Вал, это очень просто, и это просто попытка получения данных из нескольких элементов:Использование 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 было бы простым, но как только этот код попадает в инструкцию печати для child.tag_name, он дает «HEAD», и нигде в файле не обнаружено , Файл, который я загружаю, должен быть довольно стандартным, поскольку я использовал inkscape для его создания.
Does WebKit делает что-то смешное, что я не вижу документы, которые он загружает?
Спасибо.
Update:
Это определенно кажется, что WebKit загружает все в HTML-документ, потому что, когда я использую GObject получить тип и распечатать его для узла, возвращенного get_elements_by_tag_name («тело») я получаю WebKitDOMHTMLBodyElement. Как бы то ни было, я пытался сделать следующий XPath запрос на 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);
}
и все я получаю для выходных
HTML
HEAD
BODY
Я потерял в настоящее время. Файл SVG явно загружен правильно, но он не является частью документа?
Спасибо, я не знал, что WebKit сделал это, но любопытно, что он не распознает тип MIME для документа SVG. То, что вы предложили, все равно ничего не возвращает, поэтому я просто буду продолжать играть. –
Он должен (или должен) получить тип MIME, если файл был извлечен с веб-сервера. Это потому, что он входит в HTTP-заголовок. Но вы, как правило, не используете файл, который поступает из файловой системы. –