2016-11-01 26 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