2016-11-01 32 views
3

有沒有一種方法可以讓我從JavaScript中呈現的Java頁面中呈現和解析SVG元素: ,例如:http://bl.ocks.org/mbostock/raw/4063269/,這種情況下使用d3 .js文件。檢索在Java網頁上動態呈現的SVG

+0

我想補充,我已經試過HtmlUnit,jsoup,甚至在SWT進行調查,但無濟於事。這就是爲什麼這個問題有點寬泛,因爲我不想將解決方案限制在一個工具上。 –

+0

http://stackoverflow.com/questions/26027313/how-to-load-and-parse-svg-documents可能的重複? –

+0

@definecindyconst這不是[http://stackoverflow.com/questions/26027313/how-to-load-and-parse-svg-documents]的重複,解析SVG很簡單。 –

回答

1

如果你要做的是將SVG內容作爲StringSelenium是你最好的選擇,就像@chimmi說的那樣。但是,如果沒有通過使用PhantomJS來打開真正的瀏覽器窗口,您可能會離開。

從理論上講,它應該像這樣工作:

System.setProperty("phantomjs.binary.path", "/path/to/phantomjs"); 
WebDriver driver = new PhantomJSDriver(); 
// Open your page with SVG 
driver.get("http://localhost:8080/svgpage"); 

// Find the SVG 
WebElement svg = driver.findElement(By.tageName("svg")); 
// Get its XML content 
String xml = svg.getAttribute("outerHTML"); 

從這裏,你可以使用Batik如果要實際呈現在您的非Web應用程序在屏幕上的SVG。

或者,如果你想一切都使上用於測試目的的SVG內容斷言,記住你可以使用普通的CSS或XPath選擇器選擇子元素:

//Select all <path> elements within the SVG 
Lis<WebElement> pathElementsInSVG = svg.findElements(By.tagName("path")); 
//Assert there is 4 <path>s 
assert pathElementsInSVG.size() == 4 
2

如果我正確地理解了你的問題,你的問題是你使用的工具(HtmlUnit)無法處理複雜的JS(d3.js)。

在這種情況下,沒有比使用實際瀏覽器更好的了。您可以使用Selenium打開您的頁面與遠程控制的瀏覽器實例,並從那裏得到JS呈現HTML。

This tutorial包含幾乎所有你需要的。除了得到html部分,你可以在this找到答案。

之後,您可以將html提供給您想要的任何解析器。

編輯

只是想到了另外一個辦法,你可以試試WebKit Html2Pdf。它的目的是創建PDF文件,但它在底層使用WebKit,並且可以注入自定義腳本(如document.onload回調),在加載頁面後將SVG內容發佈到您的服務中。

但我不會走這條路,它有很多限制(基本上只適用於直接網址),整體都相當混亂。

+0

你的確沒有理解這個問題,htmlunit本身沒有javascript引擎。但是,我想要一個「純粹的」java方式,不知道Rhino或Nashborn是否可以處理這個問題。 –

+0

在這種情況下,你應該提出你的實際案例,因爲有很多選擇,並且據我所知,沒有一個是理想的,所以沒有人可以肯定地告訴你他們會爲你工作。 – chimmi