有没有办法让我从Java中用javascript呈现的html页面渲染和解析SVG元素, 例如:http://bl.ocks.org/mbostock/raw/4063269/,在这种情况下使用d3.js。
答案 0 :(得分:2)
如果我理解你的问题是正确的,你的问题是你使用的工具(HtmlUnit)无法处理复杂的JS(d3.js)。
在这种情况下,没有比使用实际浏览器更好的了。您可以使用Selenium使用远程控制的浏览器实例打开页面,并从那里获取JS渲染的html。
This tutorial包含了您所需要的一切。除了获取html 部分,您可以在this SO答案中找到它。
之后,您可以将html提供给您想要的任何解析器。
修改强>
想到另一种方法,你可以试试WebKit Html2Pdf。它的目的是创建PDF文件,但它使用了WebKit,你可以注入自定义脚本(如document.onload回调),它将在页面加载后将SVG内容发布给你服务。
但是我不会走那条路,它有很多限制(基本上只适用于直接网址)而且总体上很混乱。
答案 1 :(得分:1)
如果您尝试做的是将SVG内容作为String
获取,Selenium是您的最佳选择,就像@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");
如果您想在非网络应用中在屏幕上实际渲染SVG,可以使用Batik。
或者,如果您只想对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