从Java检索网页上动态呈现的SVG

从Java检索网页上动态呈现的SVG,java,html,svg,Java,Html,Svg,我是否有办法从Java中javascript呈现的html页面中呈现和解析SVG元素, 例如:,在本例中使用的是d3.js。如果我正确理解您的问题,您的问题是您使用的工具(HtmlUnit)无法处理复杂的js(d3.js) 在这种情况下,没有什么比使用实际浏览器更好的了。您可以使用远程控制浏览器实例打开页面,并从中获取JS呈现的html 包含几乎所有你需要的。除了获取html部分,您可以在SO答案中找到它 之后,您可以将html提供给您想要的任何解析器 编辑 只是想到另一种方法,你可以试试。它的

我是否有办法从Java中javascript呈现的html页面中呈现和解析SVG元素,
例如:,在本例中使用的是d3.js。

如果我正确理解您的问题,您的问题是您使用的工具(HtmlUnit)无法处理复杂的js(d3.js)

在这种情况下,没有什么比使用实际浏览器更好的了。您可以使用远程控制浏览器实例打开页面,并从中获取JS呈现的html

包含几乎所有你需要的。除了获取html部分,您可以在SO答案中找到它

之后,您可以将html提供给您想要的任何解析器

编辑

只是想到另一种方法,你可以试试。它的目的是创建PDF文件,但它在后台使用WebKit,您可以插入自定义脚本(如document.onload callback),在页面加载后将SVG内容发布到您的服务中


但我不会走这条路,它有很多限制(基本上只适用于直接URL),而且总体上相当混乱

如@chimmi所说,如果您试图将SVG内容作为
字符串
,那么这是您的最佳选择。但是,您可能会通过使用而不打开真正的浏览器窗口

理论上,它应该是这样工作的:

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");
从这里开始,如果您想要在非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
//选择SVG中的所有元素
Lis PATHELEMENTSINSSVG=svg.findElements(按.tagName(“路径”));
//断言有4个s
断言pathElementsInSVG.size()==4

补充一点,我尝试了HtmlUnit、jsoup,甚至在SWT中进行了调查,但都没有效果。这就是问题有点广泛的原因,因为我不想将解决方案局限于一个工具。可能重复?@definecindyconst这不是[,解析SVG很容易。我不确定您在这里期望什么,这个问题很不清楚。您需要一些东西来呈现SVG(你说的是JavaScript,那么你希望有一个完整的JS虚拟机吗?)并显示它。你希望它如何显示?Swing或JavaFX?你能简单地使用一个吗?你能用一些例子详细说明你的问题吗?你确实理解了这个问题,htmlunit本身没有JavaScript引擎。但是,我希望有一个“纯”的用java的方式,想知道Rhino或Nashborn是否能处理这个问题。在这种情况下,你应该展示你的实际情况,因为有很多选择,据我所知,没有一个是理想的,所以没有人能肯定地告诉你它们会为你工作。