2013-10-05 2 views
1

Я пытаюсь получить доступ к элементам 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 явно загружен правильно, но он не является частью документа?

ответ

0

Я считаю, что у Webkit есть причуда, где, если он не знает тип документа MIME, он обернет его в теги <html>. Поэтому я подозреваю, что документ, который вы пытаетесь получить доступ, был преобразован в Webkit что-то вроде:

<html> 
    <head /> 
    <body> 
    <svg>...etc...</svg> 
    </body> 
</html> 

Вот почему вы видите на <head> тег в коде.

В качестве предложения попробуйте использовать эквивалент getAlementsByTagName() для Vala, чтобы найти свой тег <svg>. От быстрого взгляда на документы, это должно быть что-то вроде:

var dom = web_view.get_dom_document(); 
    var el = dom.get_elements_by_tag_name("svg").item(0); 
    var child = var child = el.first_element_child; 

В качестве альтернативы, если есть способ сказать WebKit/WebFrame, что MIME тип файла «изображение/SVG + XML», то что также должно решить вашу проблему.

+0

Спасибо, я не знал, что WebKit сделал это, но любопытно, что он не распознает тип MIME для документа SVG. То, что вы предложили, все равно ничего не возвращает, поэтому я просто буду продолжать играть. –

+1

Он должен (или должен) получить тип MIME, если файл был извлечен с веб-сервера. Это потому, что он входит в HTTP-заголовок. Но вы, как правило, не используете файл, который поступает из файловой системы. –

Смежные вопросы