2013-10-05 1 views
1

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 파일은 정확하게로드되지만 문서의 일부가 아닙니다.

답변

0

필자는 Webkit이 문서의 MIME 유형을 모르는 경우에는 <html> 태그로 감쌀 것이라고 생각합니다. 당신은 당신의 코드에서 <head> 태그를보고있는 이유

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

: 그래서 당신이 액세스하려는 문서가 같은으로 웹킷에 의해 변환 된 생각한다.

제안 사항으로, <svg> 태그를 찾으려면 ValEa의 getElementsByTagName()과 동일한 방법을 사용해보십시오./WebFrame 파일의 MIME 유형이 "이미지/SVG + XML"이라고 웹킷을 알 수있는 방법이 있다면 다음,

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; 

다른 방법 : 워드 프로세서 얼핏에서, 그것은 뭔가를해야한다 그것은 또한 당신의 문제를 해결해야합니다.

+0

감사합니다. WebKit이 그렇게했는지는 몰랐습니다.하지만 SVG 문서의 MIME 유형을 인식하지 못하는 것이 궁금합니다. 당신이 제안한 것은 여전히 ​​아무것도 반환하지 않으므로 나는 계속 놀고있을 것입니다. –

+1

파일이 웹 서버에서 가져온 경우 MIME 형식을 가져 오거나 가져야합니다. HTTP 헤더에 들어 있기 때문입니다. 그러나 일반적으로 파일 시스템에서 오는 파일은 사용하지 않습니다. –

관련 문제