0

我一直在开发一个将表格内容打印为 XML 的 Web 服务——我使用了 WebRowSet 来执行此操作。

response.setContentType("text/xml");
WebRowSet webRowSet = new WebRowSetImpl();
webRowSet.writeXml(resultSet, response.getWriter());

(HttpServletResponse 响应)

虽然这一切都很好,但我根本不知道如何将样式表应用于 XML。我尝试使用变压器来做到这一点。

webRowSet.writeXml(resultSet, OutputStream);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource("file.xsl"));
transformer.transform(new StreamSource(InputStream), 
                      new StreamResult(response.getWriter()));

我不明白 writeXml 中的 OutputStream 和 StreamSource 中的 InputStream 是什么。(我不想将数据保存在文件中)

我发现了一个可能相关的问题?

非常感谢我如何解决这个问题的解释。

4

4 回答 4

1

看起来您真正想要做的是从结果集中获取一些/所有字段并将其写入已知的输出格式。

根据您要输出的数据的复杂性,除了使用 XSL,您还可以做的是将数据从结果集中获取到 Java 的 Collection 对象中,并将该数据传递给 Velocity 或 FreeMarker 等模板引擎。

您的 Velocity/Freemarker 模板将(或多或少)采用您预期输出的格式,因此更易于维护。

不利的一面是,如果您的结果集中的数据相当丰富,您的数据结构会变得复杂,并且您需要在将数据传递到模板引擎之前创建 JavaBean 来表示数据。这将是更多的工作,但您需要平衡它与编写和维护 XSL 的工作量。

于 2012-08-02T10:39:05.557 回答
0

您可以webRowSet将其 XML 写入 a ByteArrayOutputStream(最好包装在 aBufferedOutputStream中以用于缓冲目的)。

接下来,您可以指示您Transformer从 a 中读取ByteArrayInputStream,并使用byte[]您从ByteArrayOutputStream.

于 2012-08-02T09:38:20.583 回答
0

您有以下步骤:
WebRowSet将数据作为 xml 写入输出流 --> 以某种方式将其转换为输入流 --> 将输入流传递给转换器并将结果写入响应

第二步很棘手。实现方法之一是如您所述写入文件。您还可以使用以下命令将其写入内存ByteArrayOutputStream

ByteArrayOutputStream tempStream = new ByteArrayOutputStream();
webRowSet.writeXml(resulSet, tempStream);
...
transformer.transform(new StreamSource(new ByteArrayInputStream(tempStream.toByteArray())),
                      new StreamResult(response.getWriter()));

除非您有无法放入内存的大型 xml,否则它应该可以工作。通过这种方式,您可以写入文件或寻找不写入内存的解决方案。

于 2012-08-02T09:39:18.303 回答
0

快速说明您有关流的问题:Web 服务器也使用流来写入数据,正如您在代码的最后一行中看到的那样。

转换对象写入的输出流是响应流。

于 2012-08-02T09:40:46.633 回答