1

WebKitGtk を使用して SVG ファイルの要素にアクセスしようとしていますが、惨めに失敗しています。プログラムは Vala にあり、非常に単純で、いくつかの要素からデータを取得しようとするだけです。

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 のものを削除し、.deps ファイル内の gdk-2.0 と gtk-2.0 をそれぞれ gdk-3.0 と gtk-3.0 に置き換えます。

DOM を使用して SVG のサブ要素にアクセスするのは簡単だと思いますが、このコードが child.tag_name の print ステートメントに到達するとすぐに、「HEAD」が返され、ファイルのどこにも見つかりません。読み込んでいるファイルは、inkscape を使用して作成したので、かなり標準的なはずです。

WebKit は、それがロードするドキュメントに対して、私が見ていない面白いことをしますか?

ありがとう。

アップデート:

GObject を使用して Type を取得し、get_elements_by_tag_name("body") によって返されたノードに対して出力すると、WebKitDOMHTMLBodyElement が取得されるため、WebKit はすべてを HTML ドキュメントにロードするようです。とはいえ、DOMDocument で次の XPath クエリを実行しようとしましたが、

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 ファイルは明らかに正しく読み込まれますが、ドキュメントの一部ではありませんか?

4

1 に答える 1