问题是以下。有documentBuilderFactory创建的XML文件。然后有必要使用浏览器下载此文件。
代码如下:
StringWriter sw = new StringWriter();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc), new StreamResult(sw));
String xml = sw.toString();//returns the whole XML but in String format.
HttpServletResponse response = (HttpServletResponse)
FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setContentType("text/xml");
response.setHeader("Content-Disposition", "attachment;filename=export.xml");
ServletOutputStream out = response.getOutputStream();
out.write(xml.getBytes());
out.flush();
导出时,我有非拉丁蛋白符号的问题。例如,西里尔单词被导出为 xed xee xe2 符号。如何纠正这个?文件的另一部分被正确导出。
编码可能会出现问题,因为http响应与您写入输出流的字节之间的不匹配。
xml.getBytes()
使用您的平台默认编码。它可能是UTF-8,也可能是其他东西,例如ISO-8859-5。改用xml.getBytes(StandardCharsets.UTF_8)
。另外,HTTP响应(HTML标头(必须匹配该编码。用内容类型明确指定它:response.setContentType("text/xml; charset=utf-8");
另一方面,您可能只做out.print(xml)
,而ServletOutputStream应该照顾所有编码的复杂性。